Skip to content

Instantly share code, notes, and snippets.

View zamabuvaraeu's full-sized avatar

Эрик Замабувараев‐Ёмолкуу zamabuvaraeu

View GitHub Profile
@zamabuvaraeu
zamabuvaraeu / utfRtf.bas
Created June 26, 2026 19:00
Русский текст в RichTextBox
#define UNICODE
#include Once "windows.bi"
#include Once "win/richedit.bi"
Type TMemStream
As ZString Ptr pszData
As Integer iSize
As Integer iPos
End Type
@zamabuvaraeu
zamabuvaraeu / Reentrancy.md
Created June 18, 2026 16:16
Реентерабельность

Реентерабельность

Оконная процедура должна быть реентерабельной. Разберу вопрос подробно: что такое реентерабельность WndProc, как её нарушить и как этого избежать.

Что такое реентерабельность WndProc

Реентерабельность (reentrancy) — способность функции безопасно выполняться одновременно из нескольких потоков и вложенных вызовов. Оконная процедура WndProc должна быть реентерабельной, потому что:

  • Windows может отправить новое сообщение до завершения обработки предыдущего;
  • вызовы SendMessage или PostMessage внутри WndProc могут привести к рекурсивному вызову той же процедуры;
@zamabuvaraeu
zamabuvaraeu / Buffer.md
Last active June 17, 2026 03:16
Подводные камни передачи буфера в функцию

Подводные камни передачи буфера в функцию

Пусть ваша DLL экспортирует такую функцию:

Function Foo( _
		ByVal Buffer As WString Ptr, _
		ByVal Length As Integer _
	)As Boolean
@zamabuvaraeu
zamabuvaraeu / FullScreen.md
Last active June 8, 2026 00:01
Полноэкранный режим и обратно

Как переключить окно между обычным и полноэкранным режимами?

Фредерик Дельхом хотел узнать, существует ли простой пример кода, который переключает приложение из оконного режима в полноэкранный . Затем он приложил фрагмент кода, который выполнял довольно странные действия с родительскими окнами, а также с их скрытием и отображением.

Вы всё усложняете гораздо больше, чем нужно. Давайте начнём с нашей программы на Scratch и внесем следующие изменения:

Private Sub MainForm_OnLButtonUp( _
		ByVal self As MainForm Ptr, _
		ByVal hWin As HWND _
@zamabuvaraeu
zamabuvaraeu / RingBuffer.bas
Created April 21, 2026 11:17
Пример кольцевого буфера
#include once "windows.bi"
Private Function FindFreeAddress( _
ByVal dwSize As UInteger _
)As LPVOID
Dim lpBaseAddress As LPVOID = VirtualAlloc( _
NULL, _
dwSize, _
MEM_RESERVE, _
@zamabuvaraeu
zamabuvaraeu / Rcdata.md
Last active January 25, 2026 08:00
Как хранить и получать данные из ресурсов

Двоичные данные в ресурсах

В ресурсах можно хранить не только строки, значки, меню и диалоги. В ресурсах можно хранить любые данные: картинки, звуки к играм, видео, документы.

Для этого нам пригодится тип ресурса RCDATA в скрипте. Данные в скрипте ресурса могут быть встроенные или внешние.

Встроенные данные

Встроенные данные могут содержать строки и числа. Строки хранятся «как написано», без завершающего нуля и символов перевода строк, если они нужны — не забывайте их добавить.

Компилятор ресурсов услужливо добавит стили окон, но если вы создаёте шаблон диалогового окна самостоятельно — вы должны делать это сами

Рэймонд Чен

У клиента возникли проблемы с вложенными диалоговыми окнами. Он использовал нечто очень похожее на окно свойств, с основным диалоговым окном и набором дочерних диалоговых окон, которые поочередно появлялись внутри основного диалогового окна в зависимости от действий пользователя. Клиент обнаружил, что если дочерние диалоговые окна создавались с помощью соответствующей CreateDialogParam функции, всё работало отлично, но если шаблон создавался во время выполнения, навигация с помощью клавиатуры работала некорректно. В частности, одно из дочерних диалоговых окон содержало элемент управления редактированием, и хотя на него можно было установить фокус с помощью мыши, перейти к нему с помощью клавиши Tab было невозможно. С другой стороны, в шаблоне ресурсов такой проблемы не было. Переходы между окнами с помощью клавиши Tab работали без проблем.

Логически нет никако

О сложности достижения идеально точного расположения элементов в шаблонах диалоговых окон Win32

Рэймонд Чен

У одного из клиентов возникли проблемы с тем, чтобы шаблон диалогового окна отображал именно то, что ему нужно.

Наш дизайнер указал размеры пользовательского интерфейса в пикселях. При создании диалогового окна с использованием единиц измерения DLU в файле .rc мы не смогли получить те же размеры, которые указал дизайнер. Мы пробовали различные комбинации шрифта и размера диалогового окна, но так и не смогли найти комбинацию без ошибок округления. Кроме того, при использовании маленьких размеров шрифта соотношение сторон элементов пользовательского интерфейса изменяется при более высоких значениях DPI.

Как создать пользовательский интерфейс с точными размерами в пикселях, используя шаблоны диалоговых окон Win32? Существует ли комбинация шрифта и размера шрифта, которая обеспечит соответствие 1 DLU = 1 пиксель?

@zamabuvaraeu
zamabuvaraeu / MustZeroMemory.md
Last active May 2, 2026 09:32
Нарушение безопасности: не забывайте обнулять вещи на которые вам наплевать

Не забывайте обнулять вещи, на которые вам наплевать:

Пример 1

Выравнивание полей в структуре может быть причиной раскрытия служебной информации и памяти на машине. Возьмём структуру:

Type FileHeader
	Magic1 As UByte

J.2 Неопределенное поведение 1 Поведение не определено при следующих обстоятельствах:

Требование "должен" или "не должен", которое выходит за рамки ограничения, нарушено (пункт 4).

Непустой исходный файл не заканчивается символом новой строки, которому непосредственно не предшествует символ обратной косой черты, или заканчивается символом частичной предварительной обработки или комментарием (5.1.1.2).

Конкатенация токенов создает последовательность символов, соответствующую синтаксису универсального символьного имени (5.1.1.2).

Программа в размещенной среде не определяет функцию с именем main , используя одну из указанных форм (5.1.2.2.1).