структура OPENFILENAME

Тема в разделе "WASM.BEGINNERS", создана пользователем DPX, 26 авг 2005.

  1. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    Здравствуйте!

    У меня проблема с сабжем (скорее всего). Вызываю GetOpenFileName, и программа вылетает. Структуру заполнял так:


    Код (Text):
    1.                 mov ofn.lStructSize,SIZEOF OPENFILENAME
    2.                
    3.                 push hWin
    4.                 pop ofn.hwndOwner
    5.                
    6.                 push hInstance
    7.                 pop ofn.hInstance
    8.                
    9.                 mov ofn.lpstrFilter,offset aFilter
    10.                 push aFilterIndex
    11.                 pop ofn.nFilterIndex
    12.                 mov ofn.lpstrFile,offset aFileName
    13.                 push lFileName
    14.                 pop ofn.nMaxFile
    15.                 mov ofn.lpstrTitle,offset aCaption
    16.                 mov ofn.lpstrFileTitle,NULL
    17.                 mov ofn.lpstrCustomFilter,NULL
    18.                 mov ofn.Flags,OFN_EXPLORER or OFN_FILEMUSTEXIST
    19.                 mov ofn.lCustData,NULL
    20.                 mov ofn.lpTemplateName,NULL




    aFilter db 'Звук (*.wav)','*.wav',0,0

    aFilterIndex dd 1

    aCaption db 'Открыть файл',0

    aFileName db 0

    lFileName dd 256



    помогите пожалуйста!
     
  2. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    А где обнуление структуры ? RtlZerroMemory ? Это требование обязательно !!!
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    1. Фильтр должен выглядеть так:

    aFilter db 'Звук (*.wav)',0,'*.wav',0,0

    2. aFileName - это буфер, в который будет записано имя выбранного файла. А у тебя что?

    3. ofn.lpstrFileTitle тоже должен указывать на буфер (imho)
     
  4. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    SteelRat

    написал. правильно?

    invoke RtlZeroMemory,addr ofn,SIZEOF OPENFILENAME



    rmn

    1. исправил.

    2. это так что ли: aFileName db 256 dup (0) ?

    3. в справке написано, что "This member can be NULL".



    P.S. всё равно не работает.
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    DPX



    0, а не 1
     
  6. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    изменил на 0, так прога теперь просто вылетает, без всяких сообщений.
     
  7. Puncher

    Puncher New Member

    Публикаций:
    0
    Регистрация:
    13 авг 2005
    Сообщения:
    16
    Адрес:
    Russia
    Структура вот:


    Код (Text):
    1. struct OPENFILENAME
    2.     DWORD         lStructSize;
    3.     HWND          hwndOwner;
    4.     HINSTANCE     hInstance;
    5.     LPCTSTR       lpstrFilter;
    6.     LPTSTR        lpstrCustomFilter;
    7.     DWORD         nMaxCustFilter;
    8.     DWORD         nFilterIndex;
    9.     LPTSTR        lpstrFile;
    10.     DWORD         nMaxFile;
    11.     LPTSTR        lpstrFileTitle;
    12.     DWORD         nMaxFileTitle;
    13.     LPCTSTR       lpstrInitialDir;
    14.     LPCTSTR       lpstrTitle;
    15.     DWORD         Flags;
    16.     WORD          nFileOffset;
    17.     WORD          nFileExtension;
    18.     LPCTSTR       lpstrDefExt;
    19.     DWORD         lCustData;
    20.     LPOFNHOOKPROC lpfnHook;
    21.     LPCTSTR       lpTemplateName;
    22. ends




    Переменные типа nMax должны содержать размеры соответствующих буферов.

    Переменные типа LPSTR должны содержать адреса соответствующих буферов.



    Ошибка в твоём коде:

    ....

    mov ofn.lpstrFile,offset aFileName

    push lFileName

    pop ofn.nMaxFile

    ....



    Под lFileName не зарезервирован буфер.

    ofn.nMaxFile должен содержать размер буфера lpstrFile.

    ofn.lpstrFile - Указатель на этот буфер.



    Вот карявый, работающий пример (FASM):



    ............

    lpfilter db 'Звук - *.WAV',0,'*.wav',0,0

    lpfile rb 128

    sfile = $-lpfile

    lpfiletitle rb 128

    sfiletitle = $-lpfiletitle



    ofnstr OPENFILENAME osize,0,0,lpfilter,0,0,0,lpfile,sfile,lpfiletitle,sfiletitle,0,0,0,0,0 ,0,0,0,0

    osize=$-ofnstr

    ............



    ............

    mov EAX,[wc.hInstance]

    mov dword [ofnstr.hInstance],EAX

    invoke GetOpenFileName,ofnstr

    .............
     
  8. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    DPX

    Если хочешь реальной помощи то возьми за правило постить весь исходник, например в аттаче.
     
  9. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    вот исходник. в masm32 "rb" не работает, и "ofnstr", похоже, тоже.

    [​IMG] 1682967258__WP.zip
     
  10. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    я сделал вместо заполнения структуры OPENFILENAME использование макроса OpenFileDlg из состава макросов Masm32. Очень удобно, но есть одно но. Как мне получить строку из памяти? Можно использовать lodsb, но тогда как мне узнать длину строки - ведь это же путь, а путь - переменная величина.
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    DPX

    Ты великий приколист, сначала заполнил структуру а потом

    обнулил ее :)
     
  12. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    какая разница? я пока что её для теста заполнял, чтобы посмотреть, работает ли всё это.
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    DPX





    Если не улавливаешь разницу то тебе еще рано программировать.

    Ты заполнил структуру определенными значениями,

    после обнулил ее, т.е., уточняю, затер все

    эти значения нулями и вызвал функцию. Что ты хочешь

    в таком случае от GetOpenFileName, если ты передал

    ей структуру с нулевыми параметрами?
     
  14. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    да нет, я не это имел в виду. я, наверно, упустил то, что сначала поставил RtlZeroMemory, а потом вызов функции. но сейчас у меня уже другое исполнение этого самого Open Dialog, так что структура уже не требуется, меня больше волнует, как получить строку из памяти...
     
  15. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257




    Длина строки равна разности двух адресов - начала и конца строки. Начало - адрес буфера, в котором строка.

    А что является признаком окончания строки?
     
  16. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    DPX





    Что?







    т.е. тебе уже все-равно где в твоем исходнике

    была ошибка?



    Вот кусок кода, тут и проверка на то что вернула GetOpenFileName

    и использование строки:
    Код (Text):
    1.         case WM_COMMAND:
    2.             switch(LOWORD(wParam))
    3.             {
    4.                 case IDC_OPEN:
    5.                     RtlZeroMemory(&ofn, sizeof(ofn));
    6.                     ofn.lStructSize = sizeof(OPENFILENAME);
    7.                     ofn.hwndOwner = hDlg;
    8.                     ofn.lpstrFilter = "Executable Files (*.exe)\0*.exe\0";
    9.                     ofn.lpstrFile = ExeName;
    10.                     ofn.nMaxFile = sizeof(ExeName);
    11.                     ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_EXPLORER |
    12.                                 OFN_HIDEREADONLY | OFN_NOCHANGEDIR | OFN_NONETWORKBUTTON;
    13.                     if(GetOpenFileName(&ofn))
    14.                         SetDlgItemText(hDlg, IDC_EDIT, ExeName);
    15.                     else
    16.                     {
    17.                         SetDlgItemText(hDlg, IDC_EDIT, NULL);
    18.                         ExeName[0] = '\0';
    19.                     }
    20.                     break;
     
  17. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Посмотри мой пост, там рабочий пример (в юзермод). Даже одной структурой два типа файлов открывается :)
     
  18. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    всем спасибо, я уже нашёл такой алгоритм:
    Код (Text):
    1.                 mov lpFileName,OpenFileDlg(hWin,hInstance,offset aCaption,offset aFilter)
    2.                 .if BYTE PTR [eax]==0
    3.                     jmp ex
    4.                 .endif
    5.                 invoke szLen,lpFileName
    6.                 add eax,1
    7.                 mov ecx,eax
    8.                 mov esi,[lpFileName]
    9.                 lea edi,CurrFileName
    10.                 rep movsb
    11.                 ex:


    lpFileName LPSTR ?

    CurrFileName db ?



    для того чтобы это работало, надо включить comdlg32 и masm32 .inc и .lib файлы