Skip to content

Instantly share code, notes, and snippets.

View zamabuvaraeu's full-sized avatar

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

View GitHub Profile
@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 January 15, 2026 08:43
Нарушение безопасности: не забывайте обнулять вещи на которые вам наплевать

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

Пример 1

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

Type FileHeader
	Magic1 As UByte

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

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

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

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

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

Постоянно наталкиваюсь на путаницу между нулевым указателем и нулевым адресом. А ведь это разные вещи. И нулевой указатель может не указывать на нулевой адрес.

Нулевой указатель — собый указатель, гарантированно не ссылающийся на объект или функцию.

Нулевой адрес — просто адрес со значением ноль.

Присваивание нуля (и сравнение с нулём) — на самом деле это не присваивание, это специальная инструкция компилятору, которая заставляет считать указатели нулевыми указателями.

Dim p As Integer Ptr = 0
#include once "windows.bi"
#include once "crt.bi"
Dim user_name As String, user_age As Integer
Input "Enter your name and age, separated by a comma: ", user_name, user_age
Print "Your name is " & user_name & ", and you are " & user_age & " years old."
Print "Great!"
@zamabuvaraeu
zamabuvaraeu / QSortTest.bas
Created May 12, 2024 06:56
Сортировка массива библиотечной функцией qsort
#include once "crt.bi"
' Функция‐компаратор
' Такая функция принимает два аргумента и возвращает значение
' какой из этих аргументов больше, меньше или они равны
' Функция должна быть отмечена как "cdecl"
Function Comparator cdecl(ByVal p As Const Any Ptr, ByVal q As Const Any Ptr) As Long
Dim px As Integer Ptr = CPtr(Integer Ptr, p)
Dim py As Integer Ptr = CPtr(Integer Ptr, q)
@zamabuvaraeu
zamabuvaraeu / MemoryAllocatorTest.bas
Created April 27, 2024 10:08
Измерение производительности менеджеров памяти
#include once "crt.bi"
#include once "windows.bi"
#include once "win\ole2.bi"
Const PAGE_SIZE = 4096
Const ElapsedCount = 10
Const RepeatsCount = 5000000
Type ElapsedsVector
@zamabuvaraeu
zamabuvaraeu / ReplaceString.bas
Last active April 23, 2024 22:59
Test replace string
' Compile with fbc 1.10.1
' fbc64.exe -R -O 3 -v -w all -w error -gen gcc -m file file.bas
#include once "crt.bi"
Redim Shared pszDimPosReplaces(1000) As Zstring Ptr
Function misc_replace_string_proc(sString As Zstring , sSearchStr As Zstring, sReplaceStr As Zstring, iPosition As Integer = 1 , iSearchParam As Integer = 0 ) As String Export
Dim As Integer iIndexDim , iNextPos = iPosition-1