Программа, демонстрирующая иерархию окон Windows
Информация - Компьютеры, программирование
Другие материалы по предмету Компьютеры, программирование
становится пассивным и начинает взаимодействовать с внешним миром посредством специальным образом оформленных данных сообщений. Обработка поступающих приложению сообщений осуществляется специальной функцией, называемой оконной. Оконная функция уникальна тем, что может быть вызвана только из операционной системы, а не из приложения, которое ее содержит. Таким образом, Windows-приложение, как минимум, должно состоять из трех перечисленных элементов.
Каркасное Windows-приложение на ассемблере содержит один сегмент данных .data и один сегмент кода . code. Сегмент стека в исходных текстах Windows-приложений непосредственно описывать не нужно. Windows выделяет для стега объем памяти, размер которого задан программистом в файле с расширением . def. Текст листинга 2 достаточно большой. Поэтому для обсуждения разобьем erо комментариями на характерные фрагменты, каждый из которых затем поясним необходимой степенью детализации.
2. Каркасное Windows-приложение на ассемблере
;Пример каркасного приложения для Win32
.386
locals ;разрешает применение локальных меток в программе
.model flat, STDCALL ;модель памяти flat Я
;STDCALL - передача параметров в стиле С (справа налево),
; вызываемая процедура чистит за собой стек Ш
include windowA.inc ;включаемый файл с описаниями базовых структур
;и констант Win32 т
;Объявление внешними используемых в данной программе функций Win32 (ASCII):
extrn GetModuleHandleA:PROC
extrn GetVersionExA:PROC В
extrn GetCommandLineA:PROC
extrn GetEnvironmentStringsA:PROC
extrn GetEnvironmentStringsA:PROC
extrn GetStartupInfoA:PROC
extrn LoadIconA:PROC
extrn LoadCursorA:PROC
extrn GetStockObject:PROC
extrn RegisterClassExA:PROC
extrn CreateWindowExA:PROC
extrn ShowWindow:PROC
extrn UpdateWindow:PROC
extrn GetMessageA:PROC
extrn TranslateMessage:PROC
extrn DispatchMessageA:PROC
extrn ExitProcess:PROC
extrn PostQuitMessage:PROC
extrn DefWindowProcA:PROC
extrn PlaySoundA:PROC
extrn ReleaseDC:PROC
extrn TextOutA:PROC
extrn GetDC:PROC
extrn BeginPaint:PROC
extrn EndPaint:PROC
;объявление оконной функции объектом, видимым за пределами данного кода
public WindowProc
.data
hwnd dd 0
hInst dd 0
hdc dd 0
szClassName db Приложение Win32 ,0
szTitleName db Каркасное приложение Win32 на ассемблере.0
MesWindow db Это процесс разработки приложения
на ассемблере?
MesWindowLen= $-MesWindow
playFileCreatedbcreate.wav,0"> playFileCreate db create.wav,0
playFilePaintdbpaint.wav,0"> playFilePaint db paint.wav,0
playFileDestroydbdestroy.wav,0"> playFileDestroy db destroy.wav,0
. code
start proc near
;точка входа в программу:
;начало стартового кода
;вызовы расположенных ниже функций можно при необходимости раскомментировать,
:но они не являются обязательными в данной программе
;вызов BOOL GetVersionEx(LPOSVERSIONINFO lpVersionInformation)
; push offset lpVersionInformation
; call GetVersionExA
;далее можно вставить код для анализа информации о версии Windows
;вызов LPTSTR GetCommandLine(VOID) - получить указатель на командную строку
; call GetCommandLineA :врегистре еах адрес
;вызов LPVOID GetEnvironmentStrings (VOID) - получить указатель
;на блок с переменными окружения
; call GetEnvironmentStringsA ;врегистре еах адрес
;вызов VOIDGetStartupInfo(LPSTARTUPINFO lpStartupInfo) ;указатель
;на структуру STARTUPINFO
; push offset lpStartupInfo
; call GetStartupInfoA
;вызов HMODULE GetModuleHandleA (LPCTSTR lpModuleName)
GetModuleHandle
call GetModuleHandleA ;получить значение базового адреса,
mov hInst, eax ;no которому загружен модуль.
;далее hInst будет использоваться в качестве дескриптора данного приложения
;конец стартового кода
WinMain:
;определить класс окна ATOM RegisterClassEx(CONST WNDCLASSEX *lpWndClassEx),
; где *lpWndClassEx - адрес структуры WndClassEx
;для начала инициализируем поля структуры WndClassEx
movwcl.cbSize,typeWNDCLASSEX"> mov wcl.cbSize,typeWNDCLASSEX -.размер структуры
:в wcl.cbCIZE
movwcl.style,CS_HREDRAW+CS_VREDRAW"> mov wcl.style,CS_HREDRAW+CS_VREDRAW
movwcl.pfnWndProg,offsetWindowProg;"> mov wcl.pfnWndProg,offsetWindowProg ;адрес оконной процедуры
movwcl.cbCisExtra,0"> mov wcl.cbCisExtra,0
movwcl.cbWndExtra,0"> mov wcl.cbWndExtra,0
mov eax,hInst
mov ;дискриптор приложения в поле hInstance структуры wcl
movwcl.hInstance,eax"> mov wcl.hInstance, eax
;готовим вызов HICON LoadIcon (HINSTANCE hInstance, LPCTSTR lpIconName)
push IDI_APPLICATION ,-стандартный значок
push 0 ;NULL
саП LoadIconA
movwcl.hIcon,eax,-"> mov wcl.hIcon, eax ,-дескриптор значка в поле hIcon I
;структуры wcl
;готовим вызов HCURSOR LoadCursorA (HINSTANCE hInstance, LPCTSTR M ;lpCursorName)
push IDC_ARROW ,-стандартный курсор - стрелка
push 0
саll LoadCursorA
movwcl.hCursor,eax"> mov wcl.hCursor,eax ;дескриптор курсора в поле hCursor
;структуры wc1
;определим цвет фона окна - белый
;го?/p>