0

IczelionのWin32チュートリアル、特にチュートリアル3( "A Simple Window")に従っています。実験のためにエラー処理と不要なコードの一部を「削除」しようとすると、コンパイル時に次のエラーが発生します。

test.asm(38) : error A2111: conflicting parameter definition.

行は次のとおりです。

38行目:

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdShow:DWORD

私の質問は次のとおりです。このコード行の何が問題になっていますか?

前もって感謝します。

編集:

これがスクリプト全体で、問題のある行がコメントされています。

.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 "Testwin", 0
    AppName db "Testing Window", 0

.data?

    hInstance HINSTANCE ?

.code 
start: 

    push NULL
    call GetModuleHandle
        mov  hInstance,eax
    push SW_SHOWDEFAULT
    push NULL
    push hInstance
    call WinMain
    push eax
        call ExitProcess

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdShow:DWORD   ; this is the line
; local vars:
LOCAL wc:WNDCLASSEX 
    LOCAL msg:MSG 
    LOCAL hwnd:HWND

; defining the window:
    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 
    invoke LoadIcon,NULL,IDI_APPLICATION 
    mov   wc.hIcon,eax 
    mov   wc.hIconSm,eax 
    invoke LoadCursor,NULL,IDC_ARROW 
    mov   wc.hCursor,eax 
    invoke RegisterClassEx, addr wc 
;create the window
    invoke CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,\ 
           WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,\ 
           CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,\ 
           hInst,NULL
    invoke ShowWindow,hwnd,CmdShow
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM   
    cmp uMsg, WM_DESTROY
    jne _next
    invoke PostQuitMessage, NULL
_next:

WndProc endp      
end start    

お役に立てれば。

4

1 に答える 1

5

3 つのエラー メッセージは、何が間違っていたかを正確に説明しています。

test.asm(38) : error A2111: conflicting parameter definition.

プロトタイプをもう一度見てください。

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdShow:DWORD

WinMain前の宣言と競合するパラメーター。前の宣言を見ると、パラメーター リストが異なっていることがわかります。

次のエラー:

test.asm(69) : error A2008: syntax error: WndProc

その行を見てみましょう:

WndProc WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

構文エラーは、文法に違反したことを意味します。この場合、アセンブラが 2 番目の をどう処理するかを判断できなかったためWndProcです。ここで繰り返すことWndProcは合法ではありません。

3 番目のエラー:

test.asm(75) : fatal error A1010: unmatched block nesting: WndProc

手順が正しく開始されなかったため、WndProc終了しようとしても無効でした。

TL;DR: エラー メッセージを読んでください。彼らはあなたが間違ったことを説明します。

于 2012-08-30T04:42:27.470 に答える