Не хотел я писать, но ничего не могу поделать - не работает Пытаюсь вызвать диалог на FASM Код (Text): mov [ofn.lStructSize], 76 mov eax, [hwnd] mov [ofn.hwndOwner], eax mov [ofn.hInstance], 400000h mov [ofn.nMaxFile], 256 mov [ofn.lpstrFile],bufname mov [ofn.lpstrFilter],FilterString mov [ofn.nFilterIndex],1 mov [ofn.Flags], 001800h mov [ofn.lpstrTitle], DlgTitle push ofn call [GetOpenFileNameA] Диалог открывается и тут же закрывается, причем вместе с ним закрывается вся прога Помогите пожалуйста
001800h - это OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST хм а как это? У меня она обьявлена где OPENFILENAME:
Treant я вообще не заморачиваюсь выравниванием, а делаю так Код (Text): xor ebx,ebx Size_of_buffer equ 100 sub esp,Size_of_buffer mov ebp,esp; в ebp указатель на временный буфер под имя файла push ebx;lpTemplateName push ebx;lpfnHook push ebx;lCustData push ebx;lpstrDefExt push ebx;nFileOffset push OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY push ebx;lpstrTitle push ebx;lpstrInitialDir push ebx;nMaxFileTitle push ebx;lpstrFileTitle push Size_of_buffer;nMaxFile;sizeof.FileName push ebp;offset szFileName;lpstrFile push ebx;nFilterIndex push ebx;nMaxCustFilter push ebx;lpstrCustomFilter push offset Filter;lpstrFilter push 400000h;hInstance push ebx;hwndOwner push sizeof(OPENFILENAME);lStructSize push esp call _imp__GetOpenFileNameA@4 test eax,eax jz Exit .data Filter db "Видеофайлы *.avi; *.qt; *.mov; *.mpg; *.mpeg; *.m1v",0 db "*.avi; *.qt; *.mov; *.mpg; *.mpeg; *.m1v",0,0
Вот просто окошко и сразу вызывается диалог Код (Text): format PE GUI ; формат PE entry WinMain ; точка входа ; одна секция section '.text' code import writeable readable executable ;структуры struc POINT { .x dd ? .y dd ? } struc MSG { .hwnd dd ? .message dd ? .wParam dd ? .lParam dd ? .time dd ? .pt POINT } struc WNDCLASSEX { .cbSize dd ? .style dd ? .lpfnWndProc dd ? .cbClsExtra dd ? .cbWndExtra dd ? .hInstance dd ? .hIcon dd ? .hCursor dd ? .hbrBackground dd ? .lpszMenuName dd ? .lpszClassName dd ? .hIconSm dd ? } struc OPENFILENAME { .lStructSize dd ? .hwndOwner dd ? .hInstance dd ? .lpstrFilter dd ? .lpstrCustomFilter dd ? .nMaxCustFilter dd ? .nFilterIndex dd ? .lpstrFile dd ? .nMaxFile dd ? .lpstrFileTitle dd ? .nMaxFileTitle dd ? .lpstrInitialDir dd ? .lpstrTitle dd ? .Flags dd ? .nFileOffset dw ? .nFileExtension dw ? .lpstrDefExt dd ? .lCustData dd ? .lpfnHook dd ? .lpTemplateName dd ? } ;таблица импорта dd 0,0,0,RVA user_name,RVA user_table dd 0,0,0,RVA comdlg_name,RVA comdlg_table dq 0,0 user_table: CreateWindowExA dd RVA _CreateWindowExA RegisterClassExA dd RVA _RegisterClassExA DefWindowProcA dd RVA _DefWindowProcA GetMessageA dd RVA _GetMessageA DispatchMessageA dd RVA _DispatchMessageA PostQuitMessage dd RVA _PostQuitMessage dd 0 comdlg_table: GetOpenFileNameA dd RVA _GetOpenFileNameA dd 0 user_name db 'user32.dll',0 comdlg_name db 'comdlg32.dll',0 _RegisterClassExA dw 0 db 'RegisterClassExA' _CreateWindowExA dw 0 db 'CreateWindowExA',0 _DefWindowProcA dw 0 db 'DefWindowProcA', 0 _GetMessageA dw 0 db 'GetMessageA', 0 _DispatchMessageA dw 0 db 'DispatchMessageA', 0 _PostQuitMessage dw 0 db 'PostQuitMessage', 0 _GetOpenFileNameA dw 0 db 'GetOpenFileNameA',0 ; название окна ourTitle db 'Wnd',0 ;сообщение msg MSG ;окно wc WNDCLASSEX hwnd dd 0 ;диалог bufname rb 256 ofn OPENFILENAME FilterString db "All Files",0,"*.*",0,0 DlgTitle db "Выберите файл",0 WinMain: ;заполнение структуры окна mov [wc.cbSize],48 mov [wc.style],0 mov [wc.lpfnWndProc],WndProc mov [wc.cbClsExtra],0 mov [wc.cbWndExtra],0 mov [wc.hInstance],400000h mov [wc.hIcon],0 mov [wc.hCursor],0 mov [wc.hbrBackground],6 mov [wc.lpszMenuName],0 mov [wc.lpszClassName], ourTitle mov [wc.hIconSm],0 ;регистрация класса push wc call [RegisterClassExA] ;создание окна push 0 push 400000h push 0 push 0 push 192 push 192 push 128 push 128 push 10080000h ; WS_VISIBLE+WS_SYSMENU (видимое + кнопка закрыть) push ourTitle push ourTitle push 0 call [CreateWindowExA] mov [hwnd], eax mov [ofn.lStructSize], 76 mov eax, [hwnd] mov [ofn.hwndOwner], eax mov [ofn.hInstance], 400000h mov [ofn.nMaxFile], 256 mov [ofn.lpstrFile], bufname mov [ofn.lpstrFilter], FilterString mov [ofn.nFilterIndex], 1 mov [ofn.Flags], 001800h mov [ofn.lpstrTitle], DlgTitle push ofn call [GetOpenFileNameA] ;цикл приложения msg_loop: ;получение сообщения (Возвращает 0, если пришло сообщение WM_QUIT - выход из программы) push 0 push 0 push 0 push msg call [GetMessageA] ;если в eax 0 test eax,eax ;конец обработки цикла - выход на метку end_loop jz end_loop ;иначе пересылаем сообщение обработчику push msg call [DispatchMessageA] ; окончание цикла - возврат на начало - msg_loop jmp msg_loop ;метка конца цикла выход из программы end_loop: ret ;процедура обработки окна WndProc: ;esp-стек туда кладутся значения передаваемые в функцию ;[esp] - точка возврата ;[esp+4] - дескриптор окна ;[esp+8] - сообщение ;[esp+12] - первый параметр ;[esp+16] - второй параметр ;если передано WM_DESTROY cmp dword [esp+8],2h ;переходим на завершение jz wmdestroy ; Параметры DefWindowProc и этой процедуры совпадают ; после выполнения DefWindowProc мы больше никаких ; действий производить не собираемся. Поэтому спокой ; но используем jmp. ; Для функции DefWindowProc передаются те же параметры, ; что и для функции WndProc, поэтому достаточно будет ; поставить jmp вместо call jmp [DefWindowProcA] wmdestroy: push 0 ;вернуть в цикле 0, обнулить eax call [PostQuitMessage] xor eax,eax ret
Treant Попробовал этот код. Код (Text): mov [ofn.lStructSize], 76 mov eax, [hwnd] mov [ofn.hwndOwner], eax mov [ofn.hInstance], 400000h mov [ofn.nMaxFile], 256 mov [ofn.lpstrFile],bufname mov [ofn.lpstrFilter],FilterString mov [ofn.nFilterIndex],1 mov [ofn.Flags], 001800h mov [ofn.lpstrTitle], DlgTitle push ofn call [GetOpenFileNameA] У меня тоже выскакивает ошибка. Поменял вызов функции на Код (Text): invoke GetOpenFileNameA, ofn и ошибка исчезла, код заработал нормально.
Treant можно упростить Код (Text): msg_loop: push 0 push 0 push 0 push msg call [GetMessageA] push msg call [DispatchMessageA] ; окончание цикла - возврат на начало - msg_loop jmp msg_loop и wmdestroy: push 0 call [ExitProcess] по выходу из программы по RETn как у тебя, в программах, где используется GetOpenFileName и GetSaveFileName процесс остается в памяти, для проверки нажми Ctrl+Alt+Del а комментарий взят из моих исходников и это приятно
Да нет пока... захлопывается все вместе А с retf будет работать? ЗЫ: это окошко без наворотов весит 1 Кб О_о пошел смотреть invoke