我尝试使用程序集 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
我试图让它工作几个小时,但我没有想法。请帮忙。问候,米哈尔。