-1

我尝试使用程序集 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


我试图让它工作几个小时,但我没有想法。请帮忙。问候,米哈尔。

4

1 回答 1

2

一个被调用的子程序,无论是您自己调用还是由 Windows 调用(如 wndproc),都将其返回地址作为堆栈中的第一件事。你不想弹出这个!要访问参数,您需要查看堆栈的更远位置。尝试类似...

wndproc:
    mov eax, [esp + 4]
    mov ebx, [esp + 8]
 ; etc...

看看有没有帮助...

最好的,弗兰克

于 2012-06-28T03:25:36.690 回答