Windows 打开对话框在启用地址清理程序的情况下永远挂起
Posted
技术标签:
【中文标题】Windows 打开对话框在启用地址清理程序的情况下永远挂起【英文标题】:Windows Open Dialog Box hangs forever with Address Sanitizer enabled 【发布时间】:2021-11-15 03:44:35 【问题描述】:启用 Address Sanitizer 时,无法显示打开对话框。它永远挂着。 谢谢。
运行hr = pFileOpen->Show(NULL);
时挂起
#include <windows.h>
#include <shobjidl.h>
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED |
COINIT_DISABLE_OLE1DDE);
if (SUCCEEDED(hr))
IFileOpenDialog* pFileOpen;
// Create the FileOpenDialog object.
hr = CoCreateInstance(CLSID_FileOpenDialog, NULL, CLSCTX_ALL,
IID_IFileOpenDialog, reinterpret_cast<void**>(&pFileOpen));
if (SUCCEEDED(hr))
// Show the Open dialog box.
hr = pFileOpen->Show(NULL);
pFileOpen->Release();
CoUninitialize();
return 0;
【问题讨论】:
这段代码看起来不错(实际上并没有做任何事情)。也许您在调试模式下运行它,而 Visual Studio 需要很长时间才能加载调试废话(检查 Visual Studio IDE 中的左角)。顺便说一句,即使CoInitializeEx
失败,你也应该调用CoUninitialize
,这与其他相关函数不同。
没有加载任何内容。它只是挂起。
@BarmakShemirani "顺便说一句,即使 CoInitializeEx
失败,您也应该致电 CoUninitialize
" - 不正确。只有当CoInitialize/Ex()
成功而不是失败时才必须调用它。文档甚至这么说。唯一表明成功并因此需要CoUninitialize()
的返回值是S_OK
和S_FALSE
。其他任何事情都是失败的,所以不要调用CoUninitialize()
来调用CoInitialize/Ex()
。
这似乎是一个问题,我建议您可以将问题发布到DC以获得更好的帮助。
【参考方案1】:
这是 Address Sanitizer 集成到 Visual C++ 中的一个错误,我创建了一个 DevCom 问题。
要减少这种情况发生的频率,请在程序开头添加SetProcessAffinityMask(GetCurrentProcess(), 1);
。这似乎完全修复了打开对话框的情况,但没有修复更复杂的事件。 (请确保不要为正常程序运行保留此解决方法,因为它会有效地禁用在多个 CPU 内核上运行)
我有非官方信息表明此错误已在处理中,原因是 ASan 拦截器中的锁定顺序倒置。
【讨论】:
以上是关于Windows 打开对话框在启用地址清理程序的情况下永远挂起的主要内容,如果未能解决你的问题,请参考以下文章