error A2111 в примере третьего урока Iczeliona

Тема в разделе "WASM.BEGINNERS", создана пользователем Andrystepa, 15 сен 2007.

  1. Andrystepa

    Andrystepa New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2005
    Сообщения:
    13
    Адрес:
    Москва
    С первым и вторым уроками проблем не было. Все как написано сделал - прекрасно откомпилировалось и работало. Проблемы возникли в 3-м и всех последующих, где использовался прототип WinMain. Проблема с данной частью кода:
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. include \masm32\include\windows.inc
    6. include \masm32\include\user32.inc
    7. include \masm32\include\kernel32.inc
    8.  
    9. includelib \masm32\lib\user32.lib   ; calls to functions in user32.lib and
    10.                         ; kernel32.lib
    11. includelib \masm32\lib\kernel32.lib
    12.  
    13. WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    14.  
    15. .DATA                   ; initialized data
    16. ClassName   db "SimpleWinClass",0   ; Имя нашего класса окна
    17. AppName     db "Our First Window",0 ; Имя нашего окна
    18.  
    19. .DATA?                  ; Hеиницилизиpуемые данные
    20. hInstance   HINSTANCE ?     ; Хэндл нашей пpогpаммы
    21. CommandLine LPSTR ?
    22.  
    23. .CODE                   ; Здесь начинается наш код
    24. start:
    25.     invoke GetModuleHandle, NULL    ; Взять хэндл пpогpаммы           
    26.     mov hInstance,eax
    27.     invoke GetCommandLine       ; Взять командную стpоку.
    28.     mov CommandLine,eax
    29.     invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT  ; вызвать основную функцию
    30.     invoke ExitProcess, eax     ; Выйти из пpогpаммы.
    31.                         ; Возвpащаемое значение, помещаемое в eax,
    32.                         ; беpется из WinMain.
    33.  
    34. WinMain proc
    35.  
    36. hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    37. LOCAL wc:WNDCLASSEX     ; создание локальных пеpеменных в стеке
    38. LOCAL msg:MSG
    39. LOCAL hwnd:HWND
    40.  
    41.     mov wc.cbSize,SIZEOF WNDCLASSEX ; заполнение стpуктуpы wc
    42.     mov wc.style, CS_HREDRAW or CS_VREDRAW
    43. ........
    При компиляции командой
    Код (Text):
    1. C:\Masm32\Bin\ML.EXE /c /coff /Cp /nologo /I"C:\Masm32\Include" "SimpleWindow.asm"
    выдается куча ошибок. Приведу первые из них (полагаю, что остальные -следствие):
    Код (Text):
    1. SimpleWindow.asm(39) : error A2111: conflicting parameter definition
    2. SimpleWindow.asm(41) : error A2008: syntax error : HINSTANCE
    3. SimpleWindow.asm(42) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL
    4. SimpleWindow.asm(43) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL
    5. SimpleWindow.asm(44) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL
    6. SimpleWindow.asm(61) : error A2006: undefined symbol : wc
    7. SimpleWindow.asm(61) : error A2114: INVOKE argument type mismatch : argument : 1
    8. SimpleWindow.asm(76) : error A2006: undefined symbol : CmdShow
    9. SimpleWindow.asm(76) : error A2114: INVOKE argument type mismatch : argument : 2
    10. SimpleWindow.asm(76) : error A2006: undefined symbol : hwnd
    11. SimpleWindow.asm(76) : error A2114: INVOKE argument type mismatch : argument : 1
    Для пояснения - строки 39 - 47 это:
    Код (Text):
    1. WinMain proc
    2.  
    3. hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    4. LOCAL wc:WNDCLASSEX     ; создание локальных пеpеменных в стеке
    5. LOCAL msg:MSG
    6. LOCAL hwnd:HWND
    7.  
    8.     mov wc.cbSize,SIZEOF WNDCLASSEX ; заполнение стpуктуpы wc
    9.     mov wc.style, CS_HREDRAW or CS_VREDRAW
    10. ........
    Подскажите пожалуйста, где тут конфликт параметров? И если компилятор не видит HINSTANCE, то почему не ругается на инклуды, и если его заменить на DWORD все равно выдает ту же ошибку?
     
  2. Andrystepa

    Andrystepa New Member

    Публикаций:
    0
    Регистрация:
    27 июн 2005
    Сообщения:
    13
    Адрес:
    Москва
    Извиняюсь, ответ нашел тут же на форуме. Проблема закрыта.
     
  3. Veter

    Veter New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    161
    Код (Text):
    1. .386
    2.  
    3. .model flat,stdcall
    4.  
    5. option casemap:none
    6.  
    7. include \masm32\include\windows.inc
    8.  
    9. include \masm32\include\user32.inc
    10. include \masm32\include\kernel32.inc
    11.  
    12. includelib \masm32\lib\user32.lib
    13. includelib \masm32\lib\kernel32.lib
    14.  
    15. WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
    16.  
    17. .data
    18.  
    19. ClassName db "SimpleWinClass",0
    20. AppName  db "Our First Window",0
    21.  
    22. .data?
    23.  
    24. hInstance HINSTANCE ?
    25. CommandLine LPSTR ?
    26.  
    27. .code
    28.  
    29. start:
    30.  
    31. invoke GetModuleHandle, NULL
    32.  
    33. mov    hInstance,eax
    34.    
    35. invoke GetCommandLine
    36.  
    37. mov  CommandLine,eax
    38.  
    39. invoke WinMain, hInstance,NULL,CommandLine,SW_SHOWDEFAULT
    40.  
    41. invoke ExitProcess,eax
    42.  
    43. WinMain proc   hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR, CmdShow:DWORD
    44.  
    45. LOCAL wc:WNDCLASSEX
    46. LOCAL msg:MSG
    47. LOCAL hwnd:HWND
    48.  
    49. mov   wc.cbSize,SIZEOF WNDCLASSEX
    50. mov   wc.style, CS_HREDRAW or CS_VREDRAW
    51. mov   wc.lpfnWndProc, OFFSET WndProc
    52. mov   wc.cbClsExtra,NULL
    53. mov   wc.cbWndExtra,NULL
    54. push  hInstance
    55. pop   wc.hInstance
    56. mov   wc.hbrBackground,COLOR_WINDOW+1
    57. mov   wc.lpszMenuName,NULL
    58. mov   wc.lpszClassName,OFFSET ClassName
    59. invoke LoadIcon,NULL,IDI_APPLICATION
    60. mov   wc.hIcon,eax
    61. mov   wc.hIconSm,eax
    62. invoke LoadCursor,NULL,IDC_ARROW
    63. mov   wc.hCursor,eax
    64.  
    65. invoke RegisterClassEx, addr wc
    66.  
    67. INVOKE CreateWindowEx,
    68. NULL,
    69. ADDR ClassName,
    70. ADDR AppName,
    71. WS_OVERLAPPEDWINDOW,
    72. CW_USEDEFAULT, CW_USEDEFAULT,
    73. CW_USEDEFAULT,
    74. CW_USEDEFAULT,
    75. NULL,NULL,hInst,NULL
    76.  
    77. mov   hwnd,eax
    78.  
    79. invoke ShowWindow,hwnd,SW_SHOWNORMAL
    80.  
    81. invoke UpdateWindow, hwnd
    82.  
    83.                                       .WHILE TRUE
    84.  
    85. invoke GetMessage, ADDR msg,NULL,0,0
    86.  
    87.                                        .BREAK .IF (!eax)
    88.  
    89. invoke TranslateMessage, ADDR msg
    90. invoke DispatchMessage, ADDR msg
    91.  
    92.        .ENDW
    93.  
    94. mov  eax,msg.wParam
    95.    ret
    96.  
    97. WinMain endp
    98.  
    99.  
    100. WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
    101.  
    102.                                      .IF uMsg==WM_DESTROY
    103.  
    104. invoke PostQuitMessage,NULL
    105.  
    106.     .ELSE
    107.  
    108. invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    109.        ret
    110.  
    111.     .ENDIF
    112.  
    113.     xor eax,eax
    114.     ret
    115.  
    116. WndProc endp
    117.  
    118. end start
    вот 3 урок - компилится без проблем - ищи отличия.....

    компилирую в MasmBuilder 1.62 - советую попробовать, очень удобная штука
     
  4. Veter

    Veter New Member

    Публикаций:
    0
    Регистрация:
    23 дек 2006
    Сообщения:
    161
    АААА - WinMain(и вообще кажется все макросы,кроме инвока) должна быть записана в одну строчку - у тебя перенос и компилятор не понимает,чего ты там понаписал
     
  5. 4asm

    4asm New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2009
    Сообщения:
    2
    Что за негодяи, блин.. Решил проблему - напиши как. Неужели так трудно..
    По теме: Сейчас столкнулся с этой же проблемой. Как её решить?
     
  6. 4asm

    4asm New Member

    Публикаций:
    0
    Регистрация:
    21 июн 2009
    Сообщения:
    2
    В общем разобрался. Ошибки были в строке
    Код (Text):
    1. invoke GetCommandLine   ; Взять командную стpоку. Вы не обязаны
    2.            вызывать эту функцию ЕСЛИ ваша пpогpамма не обpабатывает командную стpоку.
    и
    Код (Text):
    1. WinMain proc
    2.  
    3. hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    Правильно так:
    Код (Text):
    1. invoke GetCommandLine   ; Взять командную стpоку. Вы не обязаны  вызывать эту функцию ЕСЛИ ваша пpогpамма не обpабатывает командную стpоку.
    и
    Код (Text):
    1. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD