0

ウィンドウを作成することができました (SO の皆さんに感謝します!)、実行するとウィンドウが形成されますが、すぐにウィンドウが壊れて、「test.exe が応答を停止しました」というメッセージが表示されます (test.exe は、プログラムの名前)。

コードは次のとおりです。

.386 
.model flat,stdcall 
option casemap:none
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

include \masm32\include\windows.inc 
include \masm32\include\user32.inc 
include \masm32\include\kernel32.inc 
include \masm32\include\gdi32.inc 
includelib \masm32\lib\user32.lib 
includelib \masm32\lib\kernel32.lib 
includelib \masm32\lib\gdi32.lib

 .data 
 ClassName db "SimpleWinClass",0 
 AppName  db "If you get this, it worked.",0 
 char WPARAM 20h                       

.data? 
hInstance HINSTANCE ? 
CommandLine LPSTR ?

.code 
start: 
push NULL
call GetModuleHandle 
mov    hInstance,eax 
call GetCommandLine
mov CommandLine,eax
push SW_SHOWDEFAULT
push CommandLine
push NULL
push hInstance
call WinMain
push eax
call ExitProcess

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD 
LOCAL wc:WNDCLASSEX 
LOCAL msg:MSG 
LOCAL hwnd:HWND 
mov   wc.cbSize,SIZEOF WNDCLASSEX 
mov   wc.style, CS_HREDRAW or CS_VREDRAW 
mov   wc.lpfnWndProc, OFFSET WndProc 
mov   wc.cbClsExtra,NULL 
mov   wc.cbWndExtra,NULL 
push  hInst 
pop   wc.hInstance 
mov   wc.hbrBackground,COLOR_WINDOW+1 
mov   wc.lpszMenuName,NULL 
mov   wc.lpszClassName,OFFSET ClassName 
push IDI_APPLICATION
push NULL
call LoadIcon
mov   wc.hIcon,eax 
mov   wc.hIconSm,eax 
push IDC_ARROW
push NULL
call LoadCursor
mov   wc.hCursor,eax 
lea eax, wc
push eax
call RegisterClassEx
push NULL
push hInst
push NULL
push NULL
push CW_USEDEFAULT
push CW_USEDEFAULT
push CW_USEDEFAULT
push CW_USEDEFAULT
push WS_OVERLAPPEDWINDOW
lea eax, AppName
push eax
lea eax, ClassName
push eax
push NULL
call CreateWindowEx
    mov   hwnd,eax 
push SW_SHOWNORMAL
push hwnd
call ShowWindow  
  push hwnd
  call UpdateWindow
     .WHILE TRUE 
         push 0
         push 0
         push NULL
         lea eax, msg
         push eax
         call GetMessage
         .BREAK .IF (!eax)
        lea eax, msg
        push eax
        call TranslateMessage
        lea eax, msg
        call DispatchMessage
     .ENDW 
     mov     eax,msg.wParam 
     ret 
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM 
    LOCAL hdc:HDC 
    LOCAL ps:PAINTSTRUCT

    .IF uMsg==WM_DESTROY 
    push NULL
    call PostQuitMessage
    .ELSEIF uMsg==WM_CHAR 
        push wParam 
        pop  char 
    push TRUE
    push NULL
    push hWnd
    call InvalidateRect
     .ELSEIF uMsg==WM_PAINT 
    lea eax, ps
    push eax
    push hWnd
    call BeginPaint
        mov    hdc,eax 
    push 1
    lea eax, char
    push eax
    push 0
    push 0
    push hdc
    call TextOut
    lea eax, ps
    push eax
    push hWnd
    call EndPaint
    .ELSE 
    push lParam
    push wParam
    push uMsg
    push hWnd
    call DefWindowProc
        ret 
    .ENDIF 
        xor    eax,eax 
        ret 
    push 0
    call ExitProcess
WndProc endp 
end start  

壊れ続けるのはなぜ?入れなかったときに同じことが起こるのを見てきましたcall ExitProcessが、今回はあるのに、なぜシャットダウンし続けるのでしょうか?

前もって感謝します

4

1 に答える 1

2

あなたは初心者で MASM を使用しているので、プッシュ/コールを使用しないことを強くお勧めします!!!! バグ以外に、INVOKE を使用しないことで得られるものは何もありません。

インボークを使用した場合、ml は問題をキャッチします。

ここで何か不足していますか?

lea eax, msg
call DispatchMessage

あなたの忘れ物push eax

また、あなたとあなたのコードを読まなければならない他のすべての人のために、インデント スタイルを使用してください。通常、左マージンとニーモニックの間には 4 つのスペースがあります。

于 2012-09-02T19:56:22.740 に答える