• 忘掉天地
  • 仿佛也想不起自己
bingliaolongBingliaolong  2023-10-19 17:18 Aet 隐藏边栏 |   抢沙发  4 
文章评分 1 次,平均分 5.0

简述

  1. Windows中,DLL(动态链接库)可以请求操作系统卸载自己,但这样做是有风险的
  2. 要确保在DLL被卸载后不再访问任何DLL内部的资源或函数

FreeLibrary

  1. 如果在test.dll的某个函数里面,获取到test.dll的句柄后,调用FreeLibrary释放了test.dll,会发生什么?
  2. 当你调用FreeLibrary,它会减少DLL的引用计数。如果引用计数达到0,系统会开始卸载该DLL
    1. 这意味着该DLL的代码、数据和其他资源都将被从内存中删除。
  3. 如果在FreeLibrary之后还有代码需要执行,那么这些代码所在的内存位置可能已经被操作系统回收或已被标记为无效
    1. 尝试在已经卸载的内存位置执行代码会导致未定义的行为,通常这会导致程序崩溃

解决

  1. 可以创建一个新线程来释放DLL,并在该线程中调用FreeLibraryAndExitThread
  2. 这样,新线程会释放DLL并安全地退出,而不会影响DLL中其他正在运行的代码

注意

  1. 应该让调用DLL的程序负责加载和卸载DLL
  2. 如果确实需要在DLL内部释放自己,确保在调用FreeLibrary后不再执行任何代码

为什么要新起线程

  1. 不会阻塞原先线程
  2. 通过在新的线程中设定了等待时间,确保原始线程在DLL卸载之前有更多的时间完成其工作

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

bingliaolong
Bingliaolong 关注:0    粉丝:0 最后编辑于:2023-11-12
Everything will be better.

发表评论

表情 格式 链接 私密 签到
扫一扫二维码分享