我尝试使用程序集 NASM 创建最简单的 WinAPI 窗口。我有 Window Proc 的问题。查看注释行:
%宏 API 2
导入 %1 %2
外部 %1
%end 宏
API GetModuleHandleA, kernel32.dll
API LoadIconA,user32.dll
API LoadCursorA,user32.dll
API RegisterClassExA, user32.dll
API CreateWindowExA, user32.dll
API MessageBoxA, user32.dll
API SendMessageA, user32.dll
API DefWindowProcA、user32.dll
API ExitProcess,kernel32.dll
API GetMessageA、user32.dll
API DispatchMessageA、user32.dll
API TranslateMessage,user32.dll
API ShowWindow,user32.dll
API 更新窗口,user32.dll
API GetCommandLineA,kernel32.dll
API PostQuitMessage,user32.dll
段 .data USE32
windowName db "你好世界!", 0
命令行 dd 0
hWnd dd 0
hInst dd 0
h光标dd 0
类名数据库“moje_okno”,0
blad db "Blad!!!",0
段.bss
结构 WNDCLASSEX
.sSize resb 4
.style resb 4
.wndProc resb 4
.clsExtra resb 4
.wnd额外资源 4
.hInstance resb 4
.hIcon resb 4
.hCursor resb 4
.background resb 4
.sMenuName resb 4
.sClassName resb 4
.hIconSm resb 4
末端结构
wndClass 结构 WNDCLASSEX
朋友
全球..开始
段 .text USE32
..开始:
推0
调用 [GetModuleHandleA]
mov dword [hInst], eax ; 应用程序句柄
推双字 0x00007f00 ;MAKEINTRESOURCE(32512)
推双字 0
调用 [LoadCursorA]
mov dword [hCursor], eax ; 光标句柄
mov dword [wndClass + WNDCLASSEX.sSize], dword 48 ; 结构尺寸
mov dword [wndClass + WNDCLASSEX.style], dword 0 ; 风格
mov dword [wndClass + WNDCLASSEX.wndProc], wndproc ; 窗口进程
mov dword [wndClass + WNDCLASSEX.clsExtra], dword 0
mov dword [wndClass + WNDCLASSEX.wndExtra], dword 0
mov eax, dword [hInst]
mov dword [wndClass + WNDCLASSEX.hInstance], eax ; 处理
mov dword [wndClass + WNDCLASSEX.hIcon], dword 0
mov eax, dword [hCursor]
mov dword [wndClass + WNDCLASSEX.hCursor], eax
mov dword [wndClass + WNDCLASSEX.background], dword 0
mov dword [wndClass + WNDCLASSEX.sMenuName], dword 0
mov dword [wndClass + WNDCLASSEX.sClassName], className ; 班级名称
mov dword [wndClass + WNDCLASSEX.hIconSm], dword 0
推送 wndClass
调用 [RegisterClassExA]
在 sprawdz_blad 附近打电话;检查 RegisterClassExA 的返回值
推 0 ; 参数
push dword [hInst] ; 处理
推 0 ;hMenu
推 0 ;父母
推 200 ;高度
推 200 ;宽度
按 200 ;y
按 200 ;x
推 0 ;风格
push className ;窗口名称
push className ;窗口类
push 0 ;扩展样式
调用 [CreateWindowExA]
推入
在 sprawdz_blad 附近调用;检查 CreateWindowExA 的返回值。返回 0
推0
调用 [退出进程]
wndproc:
; 在这里我需要访问窗口过程参数:HWND、MSG、WPARAM、LPARAM
; 我试过:
流行音乐
流行音乐
流行音乐
流行音乐
; 但它不起作用
; 这些注册表中没有正确的值
ret
盒子:
推0
推杆
推杆
推0
调用 [MessageBoxA]
ret
sprawdz_blad:
流行音乐
cmp eax, 0
好的;如果函数返回 0 一切正常
推0
推杆
推杆
推0
调用 [MessageBoxA]
推1
调用 [退出进程]
行:
ret
我试图让它工作几个小时,但我没有想法。请帮忙。问候,米哈尔。