递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 37|回复: 0
打印 上一主题 下一主题

[视窗] [BUG] DLL卸载时程序卡死

[复制链接]

25

主题

392

帖子

2278

积分

银牌会员

Rank: 6Rank: 6

积分
2278
跳转到指定楼层
楼主
发表于 4 小时前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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卡死,可以关注下是不是这个问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2026-9-14 22:19 , Processed in 0.084241 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表