Я новечок в этом деле! вобщем вот пример (из книжки) Код (Text): ; --------------- File model .386 .model flat,stdcall option casemap:none ; --------------- Includes include C:\masm32\include\windows.inc include C:\masm32\include\kernel32.inc include C:\masm32\include\user32.inc include C:\masm32\include\gdi32.inc ; --------------- Libraries includelib C:\masm32\lib\kernel32.lib includelib C:\masm32\lib\user32.lib includelib C:\masm32\lib\gdi32.lib .data ClassName BYTE "SimpleWinClass",0 AppName BYTE "Первое окно",0 wc WNDCLASSEX <> msg MSG<> hwnd HWND ? hInst HINSTANCE ? .code start: invoke GetModuleHandle, NULL mov hInst, EAX ; Handle Programmi ;///////////zapolnyayou structuru okna/////////////////////////////////////////////////////////////// mov wc.cbSize, SIZEOF WNDCLASSEX ;Число байтов занимаемое структурой 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_WINDOWFRAME 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 ;/////////////////////////////////////////////////////////////////////////////////////////////////// ;///////////Zapolnina///////////////////////////////////////////////////////////////////////////// ;Если долго посмотреть то все понятно!!!))))) 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 .WHILE TRUE invoke GetMessage, ADDR msg, NULL,0,0 or eax,eax jz Quit invoke DispatchMessage, ADDR msg .ENDW Quit: mov eax,msg.wParam invoke ExitProcess, EAX 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 После чего компилирую с такими параметрами: ml /c /coff "1.asm" link /SUBSYSTEM:windows "1.obj" Создаеться файл 1.exe но после его включения он висит в процесах и никакого окна не создаеться! OllyDbg вроде показал что все нормально но окна нету!(( и еще сразу че за ДZен такой??? че это такое? а тот тут тока это и видно.
CreateWindowEx возвращает ошибку INVALID_WINDOW_HANDLE в твоём примере. Копай в сторону неправильно заполненной структуры wc (мне так кажеццо почемуто). Счас нет времени проверять - убегаю.
ПИПЕЦ ПРОСТО! Нашел оригинальный исходник CTRL+C CTRL+V скомпилирывал работает! ОФИГЕЛ ПЕРВЫЙ РАЗ. Посмотрел вроде все также за исключением переменой одной у меня hInst а там hInstance. (Задумался) Фиг с ним думаю переделал. Компилирую всеравно все также! окна нету в процессах висит. (Задумаля второй раз). Открыл OllyDbg смотрю функция CreateWindowEx в рабочем примере ERROR_SUCCESS в моем ERROR_INVALID_WINDOW_HANDLE. Начинаю сравнивать данные OllyDbg Код (Text): 00401002 |. E8 6F010000 CALL <JMP.&kernel32.GetModuleHandleA> ; \GetModuleHandleA 00401002 |. E8 3B010000 CALL <JMP.&kernel32.GetModuleHandleA> ; \GetModuleHandleA 0040106F |. E8 E4000000 CALL <JMP.&user32.LoadIconA> ; \LoadIconA 0040106F |. E8 F2000000 CALL <JMP.&user32.LoadIconA> ; \LoadIconA 00401094 |. E8 CB000000 CALL <JMP.&user32.RegisterClassExA> ; \RegisterClassExA 00401094 |. E8 D9000000 CALL <JMP.&user32.RegisterClassExA> ; \RegisterClassExA 0040109B |. FF35 6B304000 PUSH DWORD PTR DS:[40306B] ; |hInst = NULL 0040109B |. FF35 6B304000 PUSH DWORD PTR DS:[40306B] ; |hInst = 00400000 004010CA |. E8 6B000000 CALL <JMP.&user32.CreateWindowExA> ; \CreateWindowExA 004010CA |. E8 79000000 CALL <JMP.&user32.CreateWindowExA> ; \CreateWindowExA и т.д. Если нужно предоставлю все. На скока я понимаю E8 6F010000 это машинный код команды Invoke GetModuleHandle, NULL но в моей версии он E8 3B010000. Остальное все идентично равно! не равны тока машинные команды(если я правельно понял что обозначают эти числа) (Задумался вобще в край) (знаю бред) стал доводить код двух прогг до идентичного сходства Код (Text): Рабочая версия ;А.Крупник "Самоучитель: Ассемблер" ;Листинг 13.4. Первая "оконная" программа ;Компиляция ; wmake l134 .386 .model flat,stdcall option casemap:none include C:\masm32\include\windows.inc include C:\masm32\include\user32.inc include C:\masm32\include\kernel32.inc includelib C:\masm32\lib\user32.lib includelib C:\masm32\lib\kernel32.lib .data ClassName BYTE "SimpleWinClass",0 AppName BYTE "Первое окно",0 wc WNDCLASSEX <> msg MSG <> hwnd HWND ? hInstance HINSTANCE ? .code start: invoke GetModuleHandle, NULL mov hInstance,eax ;запомнить дескриптор программы 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_WINDOWFRAME 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,hInstance,NULL mov hwnd,eax invoke ShowWindow, hwnd,SW_SHOWNORMAL .WHILE TRUE invoke GetMessage, ADDR msg, NULL, 0, 0 or eax,eax jz Quit invoke DispatchMessage, ADDR msg .ENDW Quit: mov eax,msg.wParam invoke ExitProcess,eax 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 моя версия Код (Text): .386 .model flat,stdcall option casemap:none include C:\masm32\include\windows.inc include C:\masm32\include\kernel32.inc include C:\masm32\include\user32.inc includelib C:\masm32\lib\kernel32.lib includelib C:\masm32\lib\user32.lib .data ClassName BYTE "SimpleWinClass",0 AppName BYTE "Первое окно",0 wc WNDCLASSEX <> msg MSG <> hwnd HWND ? hInstance HINSTANCE ? .code start: invoke GetModuleHandle, NULL mov hInstance, eax 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_WINDOWFRAME 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,hInstance,NULL mov hwnd,eax invoke ShowWindow, hwnd,SW_SHOWNORMAL .WHILE TRUE invoke GetMessage, ADDR msg, NULL,0,0 or eax,eax jz Quit invoke DispatchMessage, ADDR msg .ENDW Quit: mov eax,msg.wParam invoke ExitProcess, eax 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 еще раз все проверил! ВСЕ ТОЧНО ТАКЖЕ! Понял что мои знания равны 0. Ударил (Сильно) комп(не помогло) и пришел на форум!) ПОМОГИТЕ ПЛИИЗЗ где тут косяк???
В твоей версии замени invoke DefWindowProc, hwnd,uMsg,wParam,lParam на invoke DefWindowProc, hWnd,uMsg,wParam,lParam Кстати это один из примеров показывающих, почему глобальные переменные это зло %)
нда, об этом кстати ошибка CreateWindowEx и говорила. 2TSS А я тоже этого не понимал %) теперь понял ...