|
|
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卡死,可以关注下是不是这个问题
|
|