wangvoldp 发表于 2026-9-14 17:48:38

[BUG] DLL卸载时程序卡死

DLL创建窗口显示一个edge浏览器, 然后关闭窗口释放DLL时直接卡死.
用调试工具发现主线程卡在GdiplusShutdown, 但搜索代码没发现用Gdi, 后来搜索GDI关键字发现EDGE的库里面
置窗口图标 函数调用了g_objVolApp.InitGDIPlus (), 随后在系统库目录找到
inline_ BOOL_P InitGDIPlus ()
    {
      return m_objGDIPlus.init ();
    }

    inline_ void CleanupGDIPlus ()
    {
      m_objGDIPlus.Cleanup ();
    }DLLMAIN里是不能调用GdiplusShutdown的, 调用会让程序等待一个内核对象, 而这时主线程因为等待内核又没时间处理这个事件,就卡死了
下面那个 CleanupGDIPlus 调用下就可以卸载GDI, 所以只需在关闭浏览器后主动执行一下
@ g_objVolApp.CleanupGDIPlus ();再卸载DLL就不会卡死了

推荐官方库在对象关闭里直接调用一下, 或者在 浏览框.关闭 () 里调用一下
另外在 vol_bitmap.cpp 和 atlmage.h 里也发现了 InitGDIPlus, 但没发现主动释放的代码, 万一大家出现DLL卡死,可以关注下是不是这个问题
页: [1]
查看完整版本: [BUG] DLL卸载时程序卡死