Есть такая проблема Код (Text): format PE GUI 4.0 entry start include 'include\win32a.inc' section '.data' data readable writeable msg MSG <> hwnd dd 0 ProcesName db 'PROGRAMM',0 WindowName db 'PROGRAMM',0 width dd 800 height dd 600 hinstance dd 0 invoke GetModuleHandle,NULL mov [hinstance],eax wcl WNDCLASSEX <> dwExStyle dd 0 dwStyle dd 0 WindowRect RECT <> section '.code' code readable executable start: call InitWindow msg_loop: invoke PeekMessage,msg, NULL, 0, 0, PM_REMOVE cmp eax,1 jnz msg_certainFunc cmp [msg.message],WM_QUIT jz end_loop invoke TranslateMessage,msg invoke DispatchMessage,msg jmp msg_loop msg_certainFunc: jmp msg_loop end_loop: invoke ExitProcess,0 proc InitWindow push ebx esi edi mov [WindowRect.left],0 mov [WindowRect.right],width mov [WindowRect.top],0 mov [WindowRect.bottom],height mov [wcl.hInstance],hinstance mov [wcl.lpszClassName],ProcesName mov [wcl.lpfnWndProc],WindowFunc mov [wcl.style],CS_HREDRAW or CS_VREDRAW mov [wcl.cbSize],sizeof.WNDCLASSEX invoke LoadIcon,NULL,IDI_APPLICATION mov [wcl.hIcon],eax invoke LoadIcon,NULL,IDI_WINLOGO mov [wcl.hIconSm],eax invoke LoadCursor,NULL,IDC_ARROW mov [wcl.hCursor],eax mov [wcl.lpszMenuName],NULL mov [wcl.cbClsExtra],0 mov [wcl.cbWndExtra],0 invoke GetStockObject,WHITE_BRUSH mov [wcl.hbrBackground],eax invoke RegisterClassEx,wcl invoke CreateWindowEx, WS_EX_APPWINDOW or WS_EX_WINDOWEDGE,ProcesName,WindowName,\ WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN,0,0,800,600,0,0,[hinstance],0 mov [hwnd],eax invoke ShowWindow,eax,SW_SHOW pop edi esi ebx ret endp proc WindowFunc hwnd,msg,wparam,lparam push ebx esi edi cmp [msg],WM_DESTROY je .wmdestroy .defwndproc: invoke DefWindowProc,[hwnd],[msg],[wparam],[lparam] jmp .finish .wmdestroy: xor eax,eax .finish: pop edi esi ebx ret endp Эта программа не хочет завершаться. Т.е. окно закрывается, а сам процесс так и висит в диспетчере задач. Из за чего может быть такое? Заранее спасибо
RamMerLabs Имеешь ввиду процедуру для обработки сообщений? Так она же есть внизу самом proc WindowFunc hwnd,msg,wparam,lparam Clerk Я смотрел в Оле. Обработка wmdestroy проходит нормально, но после этого при выходе я потерялся где то в недрах windows. И даже на бряках установленных на главном цикле не брякнулся. И есно никакого ExitProcess не происходит
Rito Может дело и не в этом, но cmp eax,1 это не (совсем) верно, нужно делать test eax,eax + jz ..., поскольку для bool в общем случае определено только значение false = 0, а true != 0 и вообще говоря не обязано всегда быть = 1
leo Дело не в этом. Попробовал test. Всё равно процесс продолжает висеть 2FED PeekMessage TranslateMessage DispatchMessage Это уже не считается циклом сообщений?
А почему собственно Peek? почему не GetMes.. Peek ведь сразу возвращает значение, я думаю тут это не надо. может так будет работать Код (Text): cmp [msg],WM_DESTROY invoke PostQuitMessage,0 Код (Text): msg_loop: invoke GetMessage,msg, 0, 0, 0 test eax,eax jz end_loop invoke TranslateMessage,msg invoke DispatchMessage,msg jmp msg_loop end_loop: invoke ExitProcess,0
Rito Нажатие на кнопку закрытия окна посылает этому окну сообщение WM_DESTROY. Оно не посылает потоку сообщение WM_QUIT - хотя бы потому, что окон может быть много, и закрытие далеко не каждого окна должно приводить к завершению приложения. Поэтому обработчик оконных сообщений для главного окна (случай, когда как раз и должно получиться завершение приложения) самостоятельно посылает потоку WM_QUIT. Для этого существует функция PostQuitMessage, вызов которой нужно явным образом прописать в ответ на WM_DESTROY для главного окна.