我真的很难理解为什么以下函数会在下一个要处理的命令时阻塞我的整个 IEXPLORER 进程。我几乎可以肯定这与 hwndOwner 变量有关。在我对 ntdll.dll 的调用堆栈进行挖掘时。我注意到这两行:
ntdll.dll!_ZwWaitForMultipleObjects@20() + 0x15 bytes
ntdll.dll!_ZwWaitForMultipleObjects@20() + 0x15 bytes
我的一个“受过教育”的猜测是可能已经出现了死锁,但我没有工具和知识来理解究竟是什么/谁导致了它。
正如主题所说,在基于 32 位 win7 的 OS 上,这不会发生。我在我的代码中找不到任何实际锁定特定 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;
}
}
当导出文件名 =
struct EXPORTFILENAME : OPENFILENAME {
CVMNExporter* pExporter;
WCHAR szResultBurningDrive[128];
};
编辑:
我还尝试通过插入 0/NULL 来丢弃所有者 HWND。那也没用..