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_OKS_FALSE。其他任何事情都是失败的,所以不要调用CoUninitialize() 来调用CoInitialize/Ex() 这似乎是一个问题,我建议您可以将问题发布到DC以获得更好的帮助。 【参考方案1】:

这是 Address Sanitizer 集成到 Visual C++ 中的一个错误,我创建了一个 DevCom 问题。

要减少这种情况发生的频率,请在程序开头添加SetProcessAffinityMask(GetCurrentProcess(), 1);。这似乎完全修复了打开对话框的情况,但没有修复更复杂的事件。 (请确保不要为正常程序运行保留此解决方法,因为它会有效地禁用在多个 CPU 内核上运行)

我有非官方信息表明此错误已在处理中,原因是 ASan 拦截器中的锁定顺序倒置。

【讨论】:

以上是关于Windows 打开对话框在启用地址清理程序的情况下永远挂起的主要内容,如果未能解决你的问题,请参考以下文章

windows 系统进行升级之后,如何删除 Windows.old 文件夹。

如果打开一个对话框,则始终启用WPF拖放

64位版本的windows怎么兼容16位的应用程序

怎样查看.net framework的版本?

win7磁盘空间不足怎么清理

Windows下IIS搭建Ftp服务器