我真的很难在这里理解为什么以下函数会阻止我的整个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;
}
}
struct EXPORTFILENAME : OPENFILENAME {
CVMNExporter* pExporter;
WCHAR szResultBurningDrive[128];
};
我还尝试通过插入0 / NULL来丢弃所有者HWND。这也不起作用..