проблемы с getopenfilename

Тема в разделе "WASM.WIN32", создана пользователем dolbobiven, 26 июл 2005.

  1. dolbobiven

    dolbobiven New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2005
    Сообщения:
    2
    Из своей программки вызываю сабж. Работает, кроме как под дебаггером - вылетает с ACCES VIOLATION вот таким образом:

    +-[_]-CPU 80486 Thread #-328977------------------------

    ¦:BFF6117EF2AE repnz scasb

    ¦:BFF61180 83C8FE or eax,FFFFFFFE

    ¦:BFF61183 2BC1 sub eax,ecx

    ¦:BFF61185 5F pop edi

    ¦:BFF61186 59 pop ecx

    ¦:BFF61187 C9 leave

    ¦:BFF61188 C20400 ret 0004

    ¦:BFF6118B 55 push ebp

    ¦:+-[_]------------------------------------------------

    ¦:¦

    ¦:¦ Exception: Access violation, Read address=ffffffff

    ¦:¦

    Причем этот код не мой, видимо что-то внутри comdlg - вылет происходит сразу после вызова сабжевой функции.

    А без дебаггера - вроде работает, но как-то подтормаживает. Что-то из полей проиницализировать забыл??? Вот кусочек кода:



    ImportKff proc

    local ofn: OPENFILENAME

    mov ofn.lStructSize,SIZEOF ofn

    mov eax,[hDlg1]

    mov ofn.hwndOwner,eax

    mov eax,h_Inst

    mov ofn.hInstance,eax

    mov ofn.lpstrFilter,offset kffFilter

    mov ofn.lpstrFile, offset kffFileName

    mov ofn.nMaxFile, 512

    mov ofn.Flags, OFN_FILEMUSTEXIST or OFN_PATHMUSTEXIST or OFN_LONGNAMES or OFN_EXPLORER or OFN_HIDEREADONLY

    mov ofn.lpstrTitle, offset importtitle

    mov ofn.nFilterIndex,0

    mov ofn.lpstrFileTitle,0



    invoke GetOpenFileName, ADDR ofn

    test eax,eax

    je NoFileSelected
     
  2. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    dolbobiven

    Приведи переменные тоже, может с ними что ни так.

    Вот какая инициация приводится в MSDN:
    Код (Text):
    1.  
    2. OPENFILENAME ofn;       // common dialog box structure
    3. char szFile[260];       // buffer for file name
    4. HWND hwnd;              // owner window
    5. // Initialize OPENFILENAME
    6. ZeroMemory(&ofn, sizeof(ofn));
    7. ofn.lStructSize = sizeof(ofn);
    8. ofn.hwndOwner = hwnd;
    9. ofn.lpstrFile = szFile;
    10. //
    11. // Set lpstrFile[0] to '\0' so that GetOpenFileName does not
    12. // use the contents of szFile to initialize itself.
    13. //
    14. ofn.lpstrFile[0] = '\0';
    15. ofn.nMaxFile = sizeof(szFile);
    16. ofn.lpstrFilter = "All\0*.*\0Text\0*.TXT\0";
    17. ofn.nFilterIndex = 1;
    18. ofn.lpstrFileTitle = NULL;
    19. ofn.nMaxFileTitle = 0;
    20. ofn.lpstrInitialDir = NULL;
    21. ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    22.  
     
  3. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    попробуй обнулить локальную переменную ofn перед заполнением:



    lea edi,[ofn]

    mov ecx,sizeof.OPENFILENAME

    xor al,al

    rep stosb
     
  4. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    тоже самое на фасме, всё работает как надо


    Код (Text):
    1.  
    2.   proc  _openfile, lpWnd,lpTargetPath,lpSize
    3.     local      ofn:OPENFILENAME
    4.  
    5.     push    ebx esi edi
    6.     lea edi,[ofn]
    7.     xor al,al
    8.     mov ecx,sizeof.OPENFILENAME
    9.     rep stosb
    10.  
    11.     mov edi,[lpTargetPath]
    12.     or  edi,edi
    13.     jz  @F
    14.     mov ecx,[lpSize]
    15.     or  ecx,ecx
    16.     jz  @F
    17.  
    18.     rep stosb
    19.  
    20.     lea edi,[ofn]
    21.     mov [edi+OPENFILENAME.lStructSize],sizeof.OPENFILENAME
    22.     m2m [edi+OPENFILENAME.hwndOwner],[lpWnd]
    23.     mov [edi+OPENFILENAME.lpstrFilter],szFilter
    24.     mov [edi+OPENFILENAME.nFilterIndex],1
    25.     m2m [edi+OPENFILENAME.lpstrFile],[lpTargetPath]
    26.     m2m [edi+OPENFILENAME.nMaxFile],[lpSize]
    27.     mov [edi+OPENFILENAME.lpstrTitle],szFileTitle
    28.     mov [edi+OPENFILENAME.Flags],OFN_EXPLORER+OFN_FILEMUSTEXIST+OFN_HIDER EADONLY
    29.     invoke  GetOpenFileName,edi
    30.  
    31.   @@:
    32.     pop edi esi ebx
    33.     ret
    34.   endp
    35.  
     
  5. dolbobiven

    dolbobiven New Member

    Публикаций:
    0
    Регистрация:
    26 июл 2005
    Сообщения:
    2
    Всем ответившим - Гигантское спасибо. Простая очистка структурки сразу помогла.
     
  6. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    Всем привет, снова нужна ваша помощь
    функция GetOpenFileName меняет рабочий каталог моей программы
    можно заставить её это не делать, или как узнать рабочий каталог программы, чтобы потом его снова восстановить (и как восстановить)
     
  7. Quantum

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

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

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    спасиба )))