Win32asm обучение


Урок 13 - Окна в windows - часть 3


Создайте новую подпапку 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, тогда этот экземпляр является первым.



- Начало -  - Назад -  - Вперед -



Книжный магазин