Win32asm обучение


         

в этой папке со следующим


Создайте новую подпапку firstwindow в папке win32 и создайте новый файл window.asm в этой папке со следующим содержанием:
.486
.model flat, stdcall
option casemap:none

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\gdi32.lib
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\gdi32.inc
Затем создайте .bat-файл с именем make.bat. Скопируйте в него этот текст:
@echo off
ml /c /coff window.asm
link /subsystem:windows window.obj
pause>nul
<смотреть код>
Далее я буду приводить код не полностью, а только его части (для экономии места), вы можете нажать на <смотреть код>, чтобы отобразить код полностью (в новом окне).
12.4 - Регистрация класса
Теперь зарегистрируем класс в процедуре WinMain. В этой процедуре находится инициализация окна.
Добавьте это к своему файлу:
WinMain PROTO STDCALL :DWORD, :DWORD, :DWORD

.data?
hInstance dd ?
.code
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke WinMain, hInstance, NULL, NULL, SW_SHOWNORMAL
end start
Этот код получит хэндл модуля функцией getmodulehandle, поместите хэндл в переменную hInstance. Этот хэнд модуля очень часто используется в windows API. Затем вызывается процедура WinMain. Это не API функция, а процедура, которую мы теперь определим. Ее прототип: WinMain PROTO STDCALL :DWORD, :DWORD, :DWORD, :DWORD, функция с 4 параметрами.:
<смотреть код>
Теперь поместите этот код перед end start:
WinMain proc hInst:DWORD, hPrevInst:DWORD, CmdLine:DWORD, CmdShow:DWORD
ret
WinMain endp
Вы не обязаны объявлять функцию winmain. На самом деле, вы совершенно свободны в этом отношении.
hInst это описатель экземпляра (= хэндл модуля),
hPrevInst это хэндл предыдущего экземпляра программы. Под win32 нет такого понятия, как предыдущий экземпляр программы. Каждая программа одна единственная в своем адресном пространстве, поэтому значение этой переменной всегда 0. Это пережиток времен Win16, когда все экземпляры программы запускались в одном и том-же адресном пространстве, и экземпляр мог узнать, были ли запущены еще копии этой программы. Под Win16, если это значение равно NULL, тогда этот экземпляр является первым.

Содержание  Назад  Вперед