递归火山软件开发平台

标题: [BUG] DLL卸载时程序卡死 [打印本页]

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

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

推荐官方库在对象关闭里直接调用一下, 或者在 浏览框.关闭 () 里调用一下
另外在 vol_bitmap.cpp 和 atlmage.h 里也发现了 InitGDIPlus, 但没发现主动释放的代码, 万一大家出现DLL卡死,可以关注下是不是这个问题





欢迎光临 递归火山软件开发平台 (http://bbs.voldp.com/) Powered by Discuz! X3.4