2013-04-02 6 views
1

GetOpenFileName не работает с нарушением прав доступа. Файл должен находиться на DESKTOP и иметь длинное имя. Проблема возникает только после первого успешного открытия файла. Проблема возникает, когда курсор мыши наводится над файлом в качестве подсказки инструмента для отображения.shell32.dll: нарушение прав доступа во время GetOpenFileName new thread

См. Ответ ниже. Я оставляю описание исходной проблемы ниже.

Mike D.

=======================

Я использую GetOpenFileName. Иногда я получаю нарушение доступа внутри оболочки32. Нарушение никогда не происходит при первом использовании этого кода, часто требуется пять или шесть попыток. Также представляется, что если вы выбираете файл во второй или второй после всплывания окна открытого файла, нарушение не происходит. Кроме того, стек вызовов, отображаемый при отладке, не включает какой-либо из моего кода. Как будто какая-то независимая нить пробуждается, чтобы что-то сделать.

Любое понимание того, как я могу отладить это, очень ценится!

Я сделал приложение «привет», демонстрируя то же поведение. Тем не менее, для этого требуется еще много попыток. Также кажется, что нужно переключать каталоги, прежде чем он потерпит неудачу.

GOFN выполнен из потока, созданного именно для этой цели. Ниже приведен код из приложения «hello world».

typedef struct 
{ 
public: 
    HWND  hWnd; 
    HINSTANCE hInst; 
} def_params, *p_params; 

DWORD WINAPI ReadLogFile_DataRecorderThread (PVOID pvoid); 

void ReadLogFile_DataRecorder (HWND hWnd, HINSTANCE hInst) // *************************** 
{ 
    static def_params Params; 

    Params.hWnd = hWnd; 
    Params.hInst = hInst; 

    HANDLE T = CreateThread (NULL,0,ReadLogFile_DataRecorderThread,&Params,0,NULL); 

    CloseHandle (T); 

    return; 
} 

DWORD WINAPI ReadLogFile_DataRecorderThread (PVOID pvoid) 
{ 
    p_params P = (p_params) pvoid; 

    HWND hWnd = P->hWnd; 
    HINSTANCE hInst = P->hInst; 

    char ReadLogFileLastDir[256]; 

// static def_OpenFileHook Hook; 

    OPENFILENAME ofn; 
    char   fn[MAX_PATH]="\0"; 
    char   filter[32]="Text Files\0*.TXT;\0\0"; 
    char   title[]="Open IMC Data Recorder Log File"; 
    char   defext[]="TXT"; 
    int    status; 

// Get File Name 

    fn[0] = '\0'; 
    ReadLogFileLastDir[0] = '\0'; 

    ZeroMemory(&ofn, sizeof(ofn)); 

    ofn.lStructSize   = sizeof(ofn); 
    ofn.hwndOwner   = hWnd; 
    ofn.hInstance   = hInst; 
    ofn.hInstance   = (HINSTANCE) GetWindowLong (hWnd, GWL_HINSTANCE); 

    ofn.lpstrFilter   = filter; 
    ofn.nFilterIndex  = 0; 
    ofn.lpstrCustomFilter = NULL ; 
    ofn.nMaxCustFilter  = 0 ; 
    ofn.lpstrFile   = fn; 
    ofn.nMaxFile   = sizeof(fn); 
    ofn.lpstrFileTitle  = NULL; 

    if (ReadLogFileLastDir[0] == '\0') 
    { 
     SHGetSpecialFolderPath (NULL,ReadLogFileLastDir,0x0005,false); 
    }; 
    ofn.lpstrInitialDir = ReadLogFileLastDir; 
    ofn.lpstrTitle   = title; 
    ofn.Flags    = OFN_FILEMUSTEXIST | 
           OFN_PATHMUSTEXIST | 
           OFN_EXPLORER  | 
           // OFN_ENABLETEMPLATE | 
           OFN_ENABLESIZING | 
           // OFN_ENABLEHOOK  | 
           OFN_READONLY; 
    ofn.lpstrDefExt   = NULL; 
    ofn.lpfnHook   = NULL;   // Hook.DialogHook; // hook routine 
    ofn.lCustData   = NULL;   // (long) &Hook;  // data for hook routine 
    ofn.lpTemplateName  = NULL;   // MAKEINTRESOURCE(IDD_HOOKFILEOPEN); 
    ofn.nFileOffset   = 0 ; 
    ofn.nFileExtension  = 0 ; 
    ofn.lpstrDefExt   = defext; 

    status = GetOpenFileName (&ofn); 

    int S; 

    S = CommDlgExtendedError(); 

    return 0; 
} 

Когда он выходит из строя, стек вызовов выглядит следующим образом ...

SHELL32! 7ca4e035() 
SHELL32! 7cb2dc16() 
SHELL32! 7cb2dd5a() 
SHELL32! 7cb27361() 
SHELL32! 7c9f40a3() 
BROWSEUI! 75f81b9a() 
SHLWAPI! 77f69548() 
NTDLL! 7c927545() 
NTDLL! 7c927583() 
NTDLL! 7c927645() 
NTDLL! 7c92761c() 
KERNEL32! 7c80b50b() 

Извините, но я не могу получить символы для них, как у меня есть старый Visual C++ :-(

Мне кажется, что проблема возникает, когда материал GOFN собирается открыть всплывающее окно, описывающее файл, когда курсор мыши наводится на имя файла.

Th Множество обстоятельств, вызывающих проблему, несколько странно. Эксперименты показывают, что нужно сделать следующее в окне GOFN:

  • Открыть файл на СТОЛЕ
  • Hover над длинным именем файла

Если бы я сделать это дважды, он всегда терпит неудачу , Имя файла я использовал

IMCLOG_20120323_1658 _-_ 20120324_0653_CST_ + DST_E2_2_second.TXT

Я попробовал то же самое с помощью блокнота и та же проблема возникает!

+3

Это не полезно без символов. –

+0

Если вы используете Visual Studio, вы можете получить символы, щелкнув правой кнопкой мыши на стеке и выбрав «Загрузить символы из серверов Microsoft Symbol Servers». –

+1

Я бы очень тщательно проверил структуру OPENFILENAME, в которую вы проходили. В частности, поля, связанные с фильтром, поскольку фильтр можно запомнить функцией и повторно использовать в будущем. –

ответ

3

Я нашел множество сообщений по этой же проблеме.Например:

Social.MSDN Problem report
CodeProject question
CodeGuru thread

Был также Google кэшировать ссылку на отчет, так как удаленные ошибка MS Connect. Как вы обнаружили, проблема, похоже, связана с файлами на рабочем столе.

Единственное, что я нашел, это позвонить CoInitializeEx(NULL) в начале темы и позвонить по телефону CoUninitialize() в конце, так что стоит попробовать.

Кроме того, в документации MSDN для GetOpenFileName() говорит:

Начиная с Windows Vista, Открыть и Сохранить как общие диалоговые окна были заменены общей Пункт Dialog.

Так что, возможно, стоит полностью отказаться от GetOpenFileName().

+0

Даже если это не будет * * ответом на вопрос, это будет ценным косвенным знанием. +1 – 0xC0000022L

+0

Надеюсь, и это было слишком громоздко для публикации в качестве комментария. –

+0

У меня нет CoInitializeEX, но у меня есть CoInitialize. Я нашел различные статьи, предлагающие использовать #define _WIN32_DCOM, но для меня это определяет CoInitializeEx. Я попытался добавить CoInitialize, но проблема не устранена. Спасибо за ответ, по крайней мере, я знаю, что проблема заключается не в моем создании. :-) –

Смежные вопросы