С первым и вторым уроками проблем не было. Все как написано сделал - прекрасно откомпилировалось и работало. Проблемы возникли в 3-м и всех последующих, где использовался прототип WinMain. Проблема с данной частью кода: Код (Text): .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib ; calls to functions in user32.lib and ; kernel32.lib includelib \masm32\lib\kernel32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD .DATA ; initialized data ClassName db "SimpleWinClass",0 ; Имя нашего класса окна AppName db "Our First Window",0 ; Имя нашего окна .DATA? ; Hеиницилизиpуемые данные hInstance HINSTANCE ? ; Хэндл нашей пpогpаммы CommandLine LPSTR ? .CODE ; Здесь начинается наш код start: invoke GetModuleHandle, NULL ; Взять хэндл пpогpаммы mov hInstance,eax invoke GetCommandLine ; Взять командную стpоку. mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT ; вызвать основную функцию invoke ExitProcess, eax ; Выйти из пpогpаммы. ; Возвpащаемое значение, помещаемое в eax, ; беpется из WinMain. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX ; создание локальных пеpеменных в стеке LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX ; заполнение стpуктуpы wc mov wc.style, CS_HREDRAW or CS_VREDRAW ........ При компиляции командой Код (Text): C:\Masm32\Bin\ML.EXE /c /coff /Cp /nologo /I"C:\Masm32\Include" "SimpleWindow.asm" выдается куча ошибок. Приведу первые из них (полагаю, что остальные -следствие): Код (Text): SimpleWindow.asm(39) : error A2111: conflicting parameter definition SimpleWindow.asm(41) : error A2008: syntax error : HINSTANCE SimpleWindow.asm(42) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL SimpleWindow.asm(43) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL SimpleWindow.asm(44) : error A2012: PROC, MACRO, or macro repeat directive must precede LOCAL SimpleWindow.asm(61) : error A2006: undefined symbol : wc SimpleWindow.asm(61) : error A2114: INVOKE argument type mismatch : argument : 1 SimpleWindow.asm(76) : error A2006: undefined symbol : CmdShow SimpleWindow.asm(76) : error A2114: INVOKE argument type mismatch : argument : 2 SimpleWindow.asm(76) : error A2006: undefined symbol : hwnd SimpleWindow.asm(76) : error A2114: INVOKE argument type mismatch : argument : 1 Для пояснения - строки 39 - 47 это: Код (Text): WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD LOCAL wc:WNDCLASSEX ; создание локальных пеpеменных в стеке LOCAL msg:MSG LOCAL hwnd:HWND mov wc.cbSize,SIZEOF WNDCLASSEX ; заполнение стpуктуpы wc mov wc.style, CS_HREDRAW or CS_VREDRAW ........ Подскажите пожалуйста, где тут конфликт параметров? И если компилятор не видит HINSTANCE, то почему не ругается на инклуды, и если его заменить на DWORD все равно выдает ту же ошибку?
Код (Text): .386 .model flat,stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\user32.inc include \masm32\include\kernel32.inc includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib WinMain proto :DWORD,:DWORD,:DWORD,:DWORD .data ClassName db "SimpleWinClass",0 AppName db "Our First Window",0 .data? hInstance HINSTANCE ? CommandLine LPSTR ? .code start: invoke GetModuleHandle, NULL mov hInstance,eax invoke GetCommandLine mov CommandLine,eax invoke WinMain, hInstance,NULL,CommandLine,SW_SHOWDEFAULT invoke ExitProcess,eax 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 hInstance 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 INVOKE CreateWindowEx, NULL, ADDR ClassName, ADDR AppName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL,NULL,hInst,NULL mov hwnd,eax invoke ShowWindow,hwnd,SW_SHOWNORMAL invoke UpdateWindow, hwnd .WHILE TRUE invoke GetMessage, ADDR msg,NULL,0,0 .BREAK .IF (!eax) invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg .ENDW mov eax,msg.wParam ret WinMain endp WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM .IF uMsg==WM_DESTROY invoke PostQuitMessage,NULL .ELSE invoke DefWindowProc,hWnd,uMsg,wParam,lParam ret .ENDIF xor eax,eax ret WndProc endp end start вот 3 урок - компилится без проблем - ищи отличия..... компилирую в MasmBuilder 1.62 - советую попробовать, очень удобная штука
АААА - WinMain(и вообще кажется все макросы,кроме инвока) должна быть записана в одну строчку - у тебя перенос и компилятор не понимает,чего ты там понаписал
Что за негодяи, блин.. Решил проблему - напиши как. Неужели так трудно.. По теме: Сейчас столкнулся с этой же проблемой. Как её решить?
В общем разобрался. Ошибки были в строке Код (Text): invoke GetCommandLine ; Взять командную стpоку. Вы не обязаны вызывать эту функцию ЕСЛИ ваша пpогpамма не обpабатывает командную стpоку. и Код (Text): WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD Правильно так: Код (Text): invoke GetCommandLine ; Взять командную стpоку. Вы не обязаны вызывать эту функцию ЕСЛИ ваша пpогpамма не обpабатывает командную стpоку. и Код (Text): WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD