Собственно проблема такая, после вызова все работает нормально (как и сам вызов вроде), но после закрытия главного окна процесс остается висеть и работать. Совершенно точно установил, что без вызова GetOpenFileName прога завершается нормально. .data filterstr db "All Files",0,"*.*",0 db "Text Files",0,"*.txt",0,0 buffer db MAXSIZE dup(0) ofn OPENFILENAME <> ..................... в WM_CREATE написано mov ofn.lStructSize,SIZEOF ofn m2m ofn.hWndOwner, hWin m2m ofn.hInstance, hInstance mov ofn.Flags,OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or\ OFN_EXPLORER or OFN_HIDEREADONLY mov ofn.lpstrFilter, offset filterstr mov ofn.lpstrFile, offset buffer mov ofn.nMaxFile, MAXSIZE ................................. .if uMsg == WM_COMMAND mov eax, wParam .if ax == 1000 invoke GetOpenFileName, addr ofn После этого прога (процесс) убивается только диспетчером задач (окно закрывается нормально). Кажется я когда-то сталкивался с чем-то подобным, но не помню как решил проблему.
не думаю что после именно этого ... чесно. посмотри .. сей пример точно не "висит" после. посмотри что в посткуите окна родителя делается .. на всяк случай.
Да, пример не висит однако. А что должно в посткуите делаться? Сложилось впечатление, что окно уничтожается, а цикл обработки ссобщений продожает крутиться... в общем вот цикл StartLoop: xor eax,eax invoke GetMessage,ADDR msg,eax,eax,eax test eax,eax jz ExitLoop invoke TranslateMessage, ADDR msg invoke DispatchMessage, ADDR msg jmp StartLoop ExitLoop: а вот сообщения ..................................... .elseif uMsg == WM_CLOSE invoke DestroyWindow, HwndRichEdit invoke DestroyWindow, hWnd .elseif uMsg == WM_DESTROY invoke PostQuitMessage,NULL .else invoke DefWindowProc,hWin,uMsg,wParam,lParam ret .endif xor eax,eax ret Ума не приложу, от чего это может быть
_220 А вот такой проблемы в Win98 у тебя не было бы Я давно пишу Код (Text): mov edi,offset msg message_loop: push ebx push ebx push ebx push edi call _imp__GetMessageA@16 xchg eax,ecx jecxz short exit_msg_loop push edi call _imp__TranslateMessage@4 push edi call _imp__DispatchMessageA@4 jmp short message_loop exit_msg_loop: ret И все прекрасно работает если нет GetOpenFileName или GetSaveFileName
GetOpenFileName создаёт для своих целей несколько дополнительных потоков и не прибивает их при завершении. ret из главного потока выходит в kernel32, где делается ExitThread. Если поток один, то ExitThread из него приводит к завершению процесса; в противном случае продолжают крутиться остальные потоки (фактически они ничего не делают, но система об этом не знает). Так что тут нужно делать явный вызов ExitProcess, да... P.S. При завершении через ret есть одна тонкость - под 9x при таком способе нельзя разрушать регистр ebp (под NT можно).