2012-08-30 20 views
0

我正在關注Iczelion的Win32教程,特別是教程3(「簡單窗口」),並且爲了實驗而試圖「去掉」某些錯誤處理和不必要的代碼時,編譯時出現以下錯誤:x86程序集創建窗口 - 錯誤A2111:衝突的參數定義和A2008:語法錯誤 - 如何解決?

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  

希望這有助於。

+2

我懷疑這些錯誤實際上始於您在第38行之前刪除的內容。您怎麼知道這是不必要的?我還建議至少通過第75行發佈代碼。 –

+0

編輯註釋以顯示額外的代碼。對不起 – Progrmr

+0

在Iczelion教程中,他說他們是額外的「不必要的」錯誤處理循環等等。通過不必要的,他意味着它們對於程序編譯並不重要。 – Progrmr

回答

5

這三條錯誤消息解釋了你做錯了什麼。在您的原型

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 

語法錯誤意味着你違反了語法。在這種情況下,這是因爲彙編器無法弄清楚如何處理第二個WndProc;重複WndProc在這裏不合法。

第三個錯誤:

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

由於WndProc過程從來沒有得到正常啓動,你的企圖最終是無效的。

TL; DR:讀取錯誤信息。他們會解釋你做錯了什麼。

+0

感謝堆。出於某種原因,他們會輸入錯誤消息。 :) – Progrmr

相關問題