Для создания графического приложения в Windows применяется библиотека user32.lib. Рассмотрим создание простейшего графического приложения на примере диалогового окна. Для создания диалогового окна в WinAPI можно использовать функцию MessageBoxA, которая имеет следующее определение на языке C++:
int MessageBoxA( [in, optional] HWND hWnd, [in, optional] LPCSTR lpText, [in, optional] LPCSTR lpCaption, [in] UINT uType );
Первый параметр - hWnd
представляет дескриптор родительского окна. Если родительское окно не применяется, то этот параметр имеет значение NULL
. Второй параметр
представляет текст отображаемого в окне сообщения, а третий параметр - текст заголовка окна. Четвертый параметр - числовое значение, которое указывает, какие кнопки будут использоваться на окне.
Рассмотрим создание графического окна на примере. Пусть у нас есть файл hello.asm со следующим кодом:
includelib user32.lib ; подключаем библиотеку user32.lib externdef MessageBoxA:PROC ; подключаем функцию MessageBoxA .data message byte "Hello METANIT.COM!",0 ; сообщение в окне win_title byte "Asm Window", 0 ; заголовок окна .code main proc sub rsp, 40 ; 32 (shadows storage) + 8 (выравнивание) xor rcx, rcx ; HWin = NULL lea rdx, message ; отображаемое сообщение lea r8, win_title ; Заголовок диалогового окна mov r9d, 0 ; 0 - кнопка "OK" call MessageBoxA ; вызываем функцию MessageBoxA add rsp, 40 ret main endp end
Вначале подключаем библиотеку user32.lib
includelib user32.lib
Далее подключаем внешнюю функцию MessageBoxA
:
externdef MessageBoxA:PROC
Поскольку родительское окно не используется, то для первого параметра в регистр RCX передаем значение 0:
xor rcx, rcx
Второй и третий параметры, которые передаются соответственно через регистры RDX и R8, принимают в качестве теста сообщения и заголовка адреса переменных message и win_title:
lea rdx, message lea r8, win_title
В качестве кнопки последнему параметру через регистр R9 передаем число 0. Это значит, что окно будет иметь одну кнопку "OK":
mov r9, 0
Можно передать и другие значения. Например, число 1 устанавливает кнопки OK и Cancel, а число 4 - кнопки "Yes" и "No". Полный список значений можно посмотреть в документации.
Для компиляции программу компоновщику надо передать параметр /subsystem:windows. Данный параметр указывает, что будет создаваться графическое приложение. Так, скомпилируем приложение с помощью следующей команды:
ml64 hello.asm /link /subsystem:windows /entry:main
В итоге после запуска скомпилированного приложения мы увидим следующее окно: