GetOpenFileName диалог

Тема в разделе "WASM.BEGINNERS", создана пользователем Treant, 15 дек 2009.

  1. Treant

    Treant Member

    Публикаций:
    0
    Не хотел я писать, но ничего не могу поделать - не работает
    Пытаюсь вызвать диалог на FASM
    Код (Text):
    1. mov [ofn.lStructSize], 76
    2. mov eax, [hwnd]
    3. mov [ofn.hwndOwner], eax
    4. mov [ofn.hInstance], 400000h
    5. mov [ofn.nMaxFile], 256
    6. mov [ofn.lpstrFile],bufname
    7. mov [ofn.lpstrFilter],FilterString
    8. mov [ofn.nFilterIndex],1
    9. mov [ofn.Flags], 001800h
    10. mov [ofn.lpstrTitle], DlgTitle
    11.  
    12. push ofn
    13. call [GetOpenFileNameA]
    Диалог открывается и тут же закрывается, причем вместе с ним закрывается вся прога
    Помогите пожалуйста
     
  2. VaZoNeZ

    VaZoNeZ New Member

    Публикаций:
    0
    В пакете MASM32 есть примеры использования этой API. Скачайте и посмотрите, как оно используется.
     
  3. Treant

    Treant Member

    Публикаций:
    0
    да я смотрел - у всех робит, у меня - нет
    код почти такой же везде
     
  4. gEnIuS_99

    gEnIuS_99 New Member

    Публикаций:
    0
    А код комментировать кто будет? Что за циферки такие?
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    структура надеюсь выровнена?
     
  6. Asterix

    Asterix New Member

    Публикаций:
    0
    + структуру надо обнулить перед заполнением
     
  7. Treant

    Treant Member

    Публикаций:
    0
    001800h - это OFN_FILEMUSTEXIST|OFN_PATHMUSTEXIST
    хм а как это?
    У меня она обьявлена
    где OPENFILENAME:
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    align 4
    ofn OPENFILENAME

    не факт что выравнивать нужно на DWORD но смотреть сишные инклуды лень
     
  9. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Treant, покажи FilterString.
     
  10. Treant

    Treant Member

    Публикаций:
    0
    Asterix
    ясно попробую сейчас
    iZzz32
    Вот
     
  11. Treant

    Treant Member

    Публикаций:
    0
    Не помогло
     
  12. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Treant, давай код компилируемый тогда… У меня всё нормально работает с куском из первого поста.
     
  13. Blackbeam

    Blackbeam New Member

    Публикаций:
    0
    переходи на масм
     
  14. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Treant
    я вообще не заморачиваюсь выравниванием, а делаю так
    Код (Text):
    1.     xor ebx,ebx
    2. Size_of_buffer equ 100
    3.     sub esp,Size_of_buffer
    4.     mov ebp,esp; в ebp указатель на временный буфер под имя файла
    5.     push ebx;lpTemplateName
    6.     push ebx;lpfnHook
    7.     push ebx;lCustData
    8.     push ebx;lpstrDefExt
    9.     push ebx;nFileOffset
    10.     push OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY
    11.     push ebx;lpstrTitle
    12.     push ebx;lpstrInitialDir
    13.     push ebx;nMaxFileTitle
    14.     push ebx;lpstrFileTitle
    15.     push Size_of_buffer;nMaxFile;sizeof.FileName
    16.     push ebp;offset szFileName;lpstrFile
    17.     push ebx;nFilterIndex
    18.     push ebx;nMaxCustFilter
    19.     push ebx;lpstrCustomFilter
    20.     push offset Filter;lpstrFilter
    21.     push 400000h;hInstance
    22.     push ebx;hwndOwner
    23.     push sizeof(OPENFILENAME);lStructSize
    24.     push esp
    25.     call _imp__GetOpenFileNameA@4
    26.     test eax,eax
    27.     jz Exit
    28. .data
    29. Filter      db "Видеофайлы *.avi; *.qt; *.mov; *.mpg; *.mpeg; *.m1v",0
    30.                 db "*.avi; *.qt; *.mov; *.mpg; *.mpeg; *.m1v",0,0
     
  15. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Mikl___, add esp,sizeof.OPENFILENAME+Size_of_buffer после вызова забыл?
     
  16. Treant

    Treant Member

    Публикаций:
    0
    Вот просто окошко и сразу вызывается диалог
    Код (Text):
    1. format PE GUI ; формат PE
    2. entry WinMain ; точка входа
    3. ; одна секция
    4. section '.text' code import writeable readable executable
    5. ;структуры
    6.  
    7. struc POINT
    8. {
    9.   .x dd ?
    10.   .y dd ?
    11. }
    12.  
    13. struc MSG
    14. {
    15.   .hwnd    dd ?
    16.   .message dd ?
    17.   .wParam  dd ?
    18.   .lParam  dd ?
    19.   .time    dd ?
    20.   .pt      POINT
    21. }
    22.  
    23. struc WNDCLASSEX
    24. {
    25.   .cbSize        dd ?
    26.   .style         dd ?
    27.   .lpfnWndProc   dd ?
    28.   .cbClsExtra    dd ?
    29.   .cbWndExtra    dd ?
    30.   .hInstance     dd ?
    31.   .hIcon         dd ?
    32.   .hCursor       dd ?
    33.   .hbrBackground dd ?
    34.   .lpszMenuName  dd ?
    35.   .lpszClassName dd ?
    36.   .hIconSm       dd ?
    37. }
    38.  
    39. struc OPENFILENAME
    40. {
    41.   .lStructSize       dd ?
    42.   .hwndOwner         dd ?
    43.   .hInstance         dd ?
    44.   .lpstrFilter       dd ?
    45.   .lpstrCustomFilter dd ?
    46.   .nMaxCustFilter    dd ?
    47.   .nFilterIndex      dd ?
    48.   .lpstrFile         dd ?
    49.   .nMaxFile          dd ?
    50.   .lpstrFileTitle    dd ?
    51.   .nMaxFileTitle     dd ?
    52.   .lpstrInitialDir   dd ?
    53.   .lpstrTitle        dd ?
    54.   .Flags             dd ?
    55.   .nFileOffset       dw ?
    56.   .nFileExtension    dw ?
    57.   .lpstrDefExt       dd ?
    58.   .lCustData         dd ?
    59.   .lpfnHook          dd ?
    60.   .lpTemplateName    dd ?
    61. }
    62. ;таблица импорта
    63. dd 0,0,0,RVA user_name,RVA user_table
    64. dd 0,0,0,RVA comdlg_name,RVA comdlg_table
    65. dq 0,0
    66.  
    67. user_table:
    68.     CreateWindowExA dd RVA _CreateWindowExA
    69.     RegisterClassExA dd RVA _RegisterClassExA
    70.     DefWindowProcA dd RVA _DefWindowProcA
    71.     GetMessageA dd RVA _GetMessageA
    72.     DispatchMessageA dd RVA _DispatchMessageA
    73.     PostQuitMessage dd RVA _PostQuitMessage
    74.     dd 0
    75.  
    76. comdlg_table:
    77.     GetOpenFileNameA dd RVA _GetOpenFileNameA
    78.     dd 0
    79.  
    80. user_name db 'user32.dll',0
    81. comdlg_name db 'comdlg32.dll',0
    82.  
    83.  
    84. _RegisterClassExA dw 0
    85.     db 'RegisterClassExA'
    86. _CreateWindowExA dw 0
    87.     db 'CreateWindowExA',0
    88. _DefWindowProcA dw 0
    89.     db 'DefWindowProcA', 0
    90. _GetMessageA dw 0
    91.     db 'GetMessageA', 0
    92. _DispatchMessageA dw 0
    93.     db 'DispatchMessageA', 0
    94. _PostQuitMessage dw 0
    95.     db 'PostQuitMessage', 0
    96. _GetOpenFileNameA dw 0
    97.     db 'GetOpenFileNameA',0
    98.  
    99. ; название окна
    100. ourTitle db 'Wnd',0
    101. ;сообщение
    102. msg MSG
    103. ;окно
    104. wc WNDCLASSEX
    105. hwnd dd 0
    106. ;диалог
    107. bufname rb 256
    108. ofn OPENFILENAME
    109. FilterString db "All Files",0,"*.*",0,0
    110. DlgTitle db "Выберите файл",0
    111.  
    112.  
    113. WinMain:
    114. ;заполнение структуры окна
    115. mov [wc.cbSize],48
    116. mov [wc.style],0
    117. mov [wc.lpfnWndProc],WndProc
    118. mov [wc.cbClsExtra],0
    119. mov [wc.cbWndExtra],0
    120. mov [wc.hInstance],400000h
    121. mov [wc.hIcon],0
    122. mov [wc.hCursor],0
    123. mov [wc.hbrBackground],6
    124. mov [wc.lpszMenuName],0
    125. mov [wc.lpszClassName], ourTitle
    126. mov [wc.hIconSm],0
    127. ;регистрация класса
    128. push wc
    129. call [RegisterClassExA]
    130. ;создание окна
    131. push 0
    132. push 400000h
    133. push 0
    134. push 0
    135. push 192
    136. push 192
    137. push 128
    138. push 128
    139. push 10080000h ; WS_VISIBLE+WS_SYSMENU (видимое + кнопка закрыть)
    140. push ourTitle
    141. push ourTitle
    142. push 0
    143. call [CreateWindowExA]
    144. mov [hwnd], eax
    145.  
    146. mov [ofn.lStructSize], 76
    147. mov eax, [hwnd]
    148. mov [ofn.hwndOwner], eax
    149. mov [ofn.hInstance], 400000h
    150. mov [ofn.nMaxFile], 256
    151. mov [ofn.lpstrFile], bufname
    152. mov [ofn.lpstrFilter], FilterString
    153. mov [ofn.nFilterIndex], 1
    154. mov [ofn.Flags], 001800h
    155. mov [ofn.lpstrTitle], DlgTitle
    156.  
    157. push ofn
    158. call [GetOpenFileNameA]
    159. ;цикл приложения
    160. msg_loop:
    161. ;получение сообщения (Возвращает 0, если пришло сообщение WM_QUIT - выход из программы)
    162.   push 0
    163.   push 0
    164.   push 0
    165.   push msg
    166.   call [GetMessageA]
    167. ;если в eax 0
    168.   test eax,eax
    169. ;конец обработки цикла - выход на метку end_loop
    170.   jz end_loop
    171. ;иначе пересылаем сообщение обработчику
    172.   push msg
    173.   call [DispatchMessageA]
    174. ; окончание цикла - возврат на начало - msg_loop
    175. jmp msg_loop
    176. ;метка конца цикла выход из программы
    177. end_loop: ret
    178.  
    179. ;процедура обработки окна
    180.  
    181. WndProc:
    182. ;esp-стек туда кладутся значения передаваемые в функцию
    183. ;[esp] - точка возврата
    184. ;[esp+4] - дескриптор окна
    185. ;[esp+8] - сообщение
    186. ;[esp+12] - первый параметр
    187. ;[esp+16] - второй параметр
    188. ;если передано WM_DESTROY
    189. cmp dword [esp+8],2h
    190. ;переходим на завершение
    191. jz wmdestroy
    192. ; Параметры DefWindowProc и этой процедуры совпадают
    193. ; после выполнения DefWindowProc мы больше никаких
    194. ; действий производить не собираемся. Поэтому спокой
    195. ; но используем jmp.
    196. ; Для функции DefWindowProc передаются те же параметры,
    197. ; что и для функции WndProc, поэтому достаточно будет
    198. ; поставить jmp вместо call
    199. jmp [DefWindowProcA]
    200. wmdestroy:
    201.         push 0
    202. ;вернуть в цикле 0, обнулить eax
    203.         call [PostQuitMessage]
    204.         xor eax,eax
    205. ret
     
  17. irrona

    irrona Member

    Публикаций:
    0
    Treant
    Попробовал этот код.
    Код (Text):
    1. mov [ofn.lStructSize], 76
    2. mov eax, [hwnd]
    3. mov [ofn.hwndOwner], eax
    4. mov [ofn.hInstance], 400000h
    5. mov [ofn.nMaxFile], 256
    6. mov [ofn.lpstrFile],bufname
    7. mov [ofn.lpstrFilter],FilterString
    8. mov [ofn.nFilterIndex],1
    9. mov [ofn.Flags], 001800h
    10. mov [ofn.lpstrTitle], DlgTitle
    11.  
    12. push ofn
    13. call [GetOpenFileNameA]
    У меня тоже выскакивает ошибка. Поменял вызов функции на
    Код (Text):
    1. invoke GetOpenFileNameA, ofn
    и ошибка исчезла, код заработал нормально.
     
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    iZzz32
    Нет не забыл, весь пример в "сам себе Iczelion" #223 здесь только пример к GetOpenFileName
     
  19. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Treant
    можно упростить
    Код (Text):
    1. msg_loop: push 0
    2.   push 0
    3.   push 0
    4.   push msg
    5.   call [GetMessageA]
    6.   push msg
    7.   call [DispatchMessageA]
    8. ; окончание цикла - возврат на начало - msg_loop
    9. jmp msg_loop
    10. и
    11. wmdestroy:        push 0
    12.         call [ExitProcess]
    по выходу из программы по RETn как у тебя, в программах, где используется GetOpenFileName и GetSaveFileName процесс остается в памяти, для проверки нажми Ctrl+Alt+Del
    а комментарий
    взят из моих исходников и это приятно :)
     
  20. Treant

    Treant Member

    Публикаций:
    0
    Да нет пока... захлопывается все вместе
    А с retf будет работать?
    ЗЫ: это окошко без наворотов весит 1 Кб

    О_о пошел смотреть invoke