Windows 7 64位操作系统上GetOpenFileName()的无法解释的行为

时间:2012-05-03 05:56:57

标签: c++ winapi

我真的很难在这里理解为什么以下函数会阻止我的整个IEXPLORER进程,只要它是下一个要处理的命令。我几乎可以肯定它是与hwndOwner变量相关的东西。在我在ntdll.dll的callstack中的一个挖掘过程中。我注意到这两行:

ntdll.dll!_ZwWaitForMultipleObjects@20()  + 0x15 bytes  
ntdll.dll!_ZwWaitForMultipleObjects@20()  + 0x15 bytes  

我的一个“受过教育的”猜测是,可能已经出现了死锁,但我并没有过多的工具和知识来了解究竟是什么/谁造成了它。
正如主题所说,在OS 32位win7基础上,这不会发生。 我在我的代码中找不到任何实际锁定该特定hwnd并且可能导致死锁或预锁的行。

EXPORTFILENAME ofn;
        ZeroMemory(&ofn, sizeof(ofn));
        ofn.hwndOwner       = m_hWnd;
        ofn.lStructSize     = sizeof(OPENFILENAME);
        ofn.Flags           = OFN_OVERWRITEPROMPT | OFN_ENABLESIZING | OFN_EXPLORER | OFN_NOREADONLYRETURN | ((DVDBURN == (eType & DVDBURN)) ? (/*OFN_OVERWRITEPROMPT |*/ /*OFN_ENABLEINCLUDENOTIFY |*/ OFN_PATHMUSTEXIST | OFN_ENABLETEMPLATE | OFN_ENABLEHOOK) : 0);
        ofn.nFilterIndex    = 1;
        ofn.lpstrTitle      = Title;
        ofn.lpstrFilter     = szFilter;
        ofn.lpstrFile       = szResult; 
        ofn.nMaxFile        = MAX_PATH;
        ofn.lpstrDefExt     = szFilter + wcslen(szFilter) + 1; // UGH..
        if(DVDBURN == (eType & DVDBURN)) {
            ofn.lpfnHook        = DVDSelectorProc;
            ofn.lpTemplateName  = MAKEINTRESOURCE(IDD_DLG_EXPORTER_BURNNER);
            ofn.hInstance       = (HINSTANCE)&__ImageBase;
        }
        ofn.pExporter       = this;

        if(0 == (eType & OPENFILE)) {
            if( ::GetSaveFileName(&ofn))
                VerifyTargetFileName(szResult, szResultOut);
            else {
                SetLastError(CommDlgExtendedError());
                goto GracefulExit;
            }
        } else {
            ATLTRACE("GFX ThreadId = %u\r\n", GetCurrentThreadId());
            if( ::GetOpenFileName(&ofn))
                VerifyTargetFileName(szResult, szResultOut);
            else {
                SetLastError(CommDlgExtendedError());
                goto GracefulExit;
            }
        }
EXPORTFILENAME =

    struct EXPORTFILENAME : OPENFILENAME {
        CVMNExporter*   pExporter;
        WCHAR           szResultBurningDrive[128];
    };

编辑:

我还尝试通过插入0 / NULL来丢弃所有者HWND。这也不起作用..

0 个答案:

没有答案