アセンブリ 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 UpdateWindow,user32.dll API GetCommandLineA、kernel32.dll API PostQuitMessage,user32.dll セグメント .data USE32 windowName db "Hello world!", 0 cmdLine dd 0 hWnd dd 0 hInst dd 0 hCursor dd 0 className db "moje_okno",0 blad db "Blad!!!",0 セグメント.bss 構造体 WNDCLASSEX .sSize resb 4 .style resb 4 .wndProc resb 4 .clsExtra resb 4 .wndExtra resb 4 .hインスタンス resb 4 .hIcon resb 4 .hCursor resb 4 .background resb 4 .sMenuName resb 4 .sClassName resb 4 .hIconSm resb 4 エンドストラクチャー wndClass istruc WNDCLASSEX エンド グローバル..開始 セグメント .text USE32 ..始める: プッシュ 0 [GetModuleHandleA] を呼び出す mov dword [hInst], eax ; アプリケーション ハンドル dword 0x00007f00 をプッシュします。MakeINTRESOURCE(32512) dword 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 ; パラメータ プッシュ dword [hInst] ; 扱う プッシュ 0 ;hMenu プッシュ 0 ;親 プッシュ 200 ; 高さ プッシュ 200 ;幅 プッシュ 200 ;y プッシュ 200 ;x プッシュ 0 ;スタイル push className ; ウィンドウ名 push className ;ウィンドウ クラス プッシュ 0 ; 拡張スタイル [CreateWindowExA] を呼び出す eaxを押す sprawdz_blad の近くを呼び出します。CreateWindowExA の戻り値を確認します。戻り値 0 プッシュ 0 [ExitProcess] を呼び出す wndproc: ; ここで、WINDOW PROC パラメータにアクセスする必要があります: HWND、MSG、WPARAM、LPARAM ; 私は試した: ポップイークス ポップ ebx ポップecx ポップEDX ; しかし、それは機能しません ; これらのレジストリには正しい値がありません 戻る 箱: プッシュ 0 ブラッドを押す ブラッドを押す プッシュ 0 [MessageBoxA] を呼び出す 戻る sprawdz_blad: ポップイークス cmp eax, 0 大丈夫です。関数が 0 を返す場合、すべて問題ありません プッシュ 0 ブラッドを押す ブラッドを押す プッシュ 0 [MessageBoxA] を呼び出す プッシュ 1 [ExitProcess] を呼び出す わかった: 戻る
私はそれを何時間も機能させようとしますが、アイデアがありません。助けてください。ごきげんよう、ミハル。