Здравствуйте. Меня интересует такой вопрос. Как можно создать хотя бы простое окно например без объявления структуры WNDCLASS? Зарание всем благодарен
Message-only window: Код (Text): HWND MesgWindow = CreateWindowEx(0, L"Message", NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL);
Вы меня наверно немного не поняли. Вот кусок кода: Winmain proc near mov style, CS_HREDRAW or CS_VREDRAW mov lpfnWndProc, OFFSET WndProc mov cbClsExtra,NULL mov cbWndExtra,NULL push diini pop hInstance mov hbrBackground,COLOR_WINDOW mov lpszMenuName,NULL mov lpszClassName,OFFSET titleprog push IDI_APPLICATION push 0 call LoadIcon mov hIcon,eax mov hIconSm,eax push IDC_ARROW push 0 call LoadCursor mov hCursor,eax lea eax,wc push eax call RegisterClassEx wc: cbSize DWORD ? style DWORD ? lpfnWndProc DWORD ? cbClsExtra DWORD ? cbWndExtra DWORD ? hInstance DWORD ? hIcon DWORD ? hCursor DWORD ? hbrBackground DWORD ? lpszMenuName DWORD ? lpszClassName DWORD ? hIconSm DWORD ? Где в нем ошибка??
Для создания окна WNDCLASS не нужна. Эта структура нужна для регистрации класса окна. По видимому, вы путаете эти понятия.
скорее всего в заполнении поля cbSize, отсутствующее в приведённом коде кстати зачем lea eax, [wc]? можно же сразу push offset wc.
Может, лучше так? Код (Text): DefStyle EQU CS_BYTEALIGNWINDOW or CS_HREDRAW or CS_VREDRAW RegNewClass MACRO style:=<DefStyle>, wndproc:=<DefWindowProc>, cbClsExtra:=<0>, cbWndExtra:=<0>, hInstance:REQ, \ hIcon:=<NULL>, hCursor:=<NULL>, hbrBackground:=<NULL>, rcMenuName:=<NULL>, lpClassName:REQ, bNotPush IFB <bNotPush> PUSH EDI ENDIF ;; Инициализация класса ... MOV EDI, ESP ;; -- WNDCLASS struct stack begin PUSH lpClassName PUSH rcMenuName PUSH hbrBackground PUSH hCursor PUSH hIcon PUSH hInstance PUSH cbWndExtra PUSH cbClsExtra PUSH wndproc PUSH style MOV EAX, ESP ;; -- WNDCLASS struct end ;; Регистрация класса ... PUSH EDI INVOKE RegisterClass, EAX POP ESP ;; restore stack IFB <bNotPush> POP EDI ENDIF ENDM А потом в коде уже использовать.
а можно вообше вот так)) Winmain proc near push ebp mov ebp, esp add esp,-50h mov DWORD PTR [ebp-30h],30h ;cbSize mov DWORD PTR [ebp-2ch],3 ;style, CS_HREDRAW or CS_VREDRAW mov DWORD PTR [ebp-28h],OFFSET WndProc ;lpfnWndProc, OFFSET WndProc mov DWORD PTR [ebp-24h],0 ;cbClsExtra,NULL mov DWORD PTR [ebp-20h],0 ;cbWndExtra,NULL push diini pop DWORD PTR [ebp-1ch] ;hInstance mov DWORD PTR [ebp-10h],5 ;hbrBackground,COLOR_WINDOW mov DWORD PTR [ebp-0ch],0 ;lpszMenuName,NULL mov DWORD PTR [ebp-8],OFFSET titleprog ;lpszClassName,OFFSET titleprog push IDI_APPLICATION push 0 call LoadIcon mov DWORD PTR [ebp-18h],eax ;hIcon,eax mov DWORD PTR [ebp-4],eax ;hIconSm,eax push IDC_ARROW push 0 call LoadCursor mov DWORD PTR [ebp-14h],eax ;hCursor,eax lea eax,DWORD PTR [ebp-30h] push eax call RegisterClassEx но мне всё-таки хотелось бы до конца, понять почему не заработал мой первый код)
¦)) Спасибо. Действительно, без HWND_MESSAGE никакое не message-only. Код (Text): CreateWindowEx(0, L"Message", NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
А по моему нет) Размер ЕХЕ получается ровно такой же, как при использовании кода: include \masm32\include\windows.inc WinMain PROTO STDCALL WORD, WORD, WORD, WORD .data? hInstance dd ? .data ClassName db "FirstWindowClass",0 AppName db "FirstWindow",0 .code WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShowWORD LOCAL wc:WNDCLASSEX LOCAL hwndWORD LOCAL msg:MSG 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 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
Llirik Код (Text): DefStyle EQU CS_BYTEALIGNWINDOW or CS_HREDRAW or CS_VREDRAW RegNewClass MACRO style:=<DefStyle>, wndproc:=<DefWindowProc>, cbClsExtra:=<0>, cbWndExtra:=<0>, hInstance:REQ, \ hIcon:=<NULL>, hCursor:=<NULL>, hbrBackground:=<NULL>, rcMenuName:=<NULL>, lpClassName:REQ, bNotPush IFB <bNotPush> PUSH EDI ENDIF ;; Инициализация класса ... MOV EDI, ESP ;; -- WNDCLASS struct stack begin PUSH lpClassName PUSH rcMenuName PUSH hbrBackground PUSH hCursor PUSH hIcon PUSH hInstance PUSH cbWndExtra PUSH cbClsExtra PUSH wndproc PUSH style MOV EAX, ESP ;; -- WNDCLASS struct end ;; Регистрация класса ... PUSH EDI INVOKE RegisterClass, EAX POP ESP ;; restore stack IFB <bNotPush> POP EDI ENDIF ENDM Я предлагаю вот это макроопределение использовать.