Неинициализированная
UnInitializedstructure SOMESTRUCTURE <>
В первом примере, новая структура создана (Initializedstructure содержит ее смещение), и каждый элемент данных структуры заполнен начальным значением. Второй пример просто говорит masm'у зарезервировать память для структуры, и каждый элемент данных структуры установить в 0. После создания структуры вы можете обращаться к любому ее элементу:
mov eax, Initializedstructure.some_word
; теперь eax будет содержать 10
inc UnInitializedstructure.dword1
; переменная dword1 структуры увеличена на 1
Таблица показывает, как эта структура была бы сохранена в памяти.
Расположение в памяти | Содержимое |
offset of Initializedstructure | 100 (dword, 4 байта) |
offset of Initializedstructure + 4 | 200 (dword, 4 байта) |
offset of Initializedstructure + 8 | 10 (word, 2 байта) |
offset of Initializedstructure + 10 | 65 or 'A' (1 байт) |
offset of Initializedstructure + 11 | 90h (1 байт) |
12.3 - WNDCLASSEX
Достаточно о структурах, давайте продолжать RegisterClassEx. В win32 справочнике программиста вы можете найти описание структуры WNDCLASSEX.
typedef struct _WNDCLASSEX { // wc
UINT cbSize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
} WNDCLASSEX;
Анализ:
cbSize | Размер структуры WNDCLASSEX в байтах. Вы можете получить этот размер с помощью оператора SIZEOF: mov ws.cbSize, SIZEOF WNDCLASSEX |
style | Стиль окон, создаваемых из это класса. |
lpfnWndProc | Указатель на процедуру окна (об этом я расскажу ниже) |
cbClsExtra | Количество дополнительных байтов, которые нужно зарезервировать (они будут следовать за самой структурой). |
cbWndExtra | Количество дополнительных батов, которые нужно зарезервировать (они будут следовать за window instance). |
hInstance | Хэндл вашей программы. Вы можете получить это хэндл функцией GetModuleHandle. |
hIcon | Хэндл иконки. Получите его функцией LoadIcon. |
hCursor | Хэндл курсора. Получите его функцией LoadCursor. |
hbrBackground | Хэндл кисти для закрашивания фона, или один из стандартных, таких как COLOR_WINDOW, COLOR_BTNFACE , COLOR_BACKGROUND. |
lpszMenuName | Указатель на строку с нулевым символом в конце, которая определяет имя ресурса меню класса. Это также может быть ID ресурса. |
lpszClassName | Указатель на строку с нулевым символом в конце, которая определяет имя класса для окон. |
hIconSm | Хэнд маленькой иконки. |