VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1863|回复: 7

[求助] C++:DLL重复加载问题

[复制链接]
49_avatar_middle
在线会员 发表于 2016-1-30 23:08:27 | 显示全部楼层 |阅读模式
20驿站币
在CDllapp.cpp的初始化函数中,他通过调用CreateThread函数来调用FreeLibaray卸载实例句柄:

HANDLE hThread = ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)FreeLibrary,theApp.m_hInstance,0,0);
CloseHandle(hThread);

我的疑问是他为什么不直接调用FreeLibrary(theApp.m_hInstance)来卸载,而要重新开辟线程呢。重新开辟线程有什么好处呢?

我做了个小测试,发现直接调用FreeLibrary(theApp.m_hInstance)之后,程序在关闭的时候会出错,而通过开辟线程来调用则不会出现上述问题!这是为什么呀!求高手解释解释,谢谢喽C++:DLL重复加载问题





上一篇:ReadString读取Unicode TXT文本错误
下一篇:POST 登录WEBQQ
49_avatar_middle
online_vip 发表于 2016-1-31 15:27:58 | 显示全部楼层
你这啥东西都没有,怎么一起交流呀?
43_avatar_middle
在线会员 发表于 2016-2-1 13:09:42 来自手机 | 显示全部楼层
同意 可能跟线程调度有关系
54_avatar_middle
在线会员 发表于 2016-2-2 15:17:37 | 显示全部楼层
可能没有清除DLLL造成的
22_avatar_middle
在线会员 发表于 2016-2-3 18:29:20 | 显示全部楼层
这个很好理解,你在自身dll中FreeLibrary肯定是失败的,因为你本身代码还在dll中执行。
但是创建一个线程的话,执行的代码就是系统dll中,所以能FreeLibrary成功。
49_avatar_middle
ico_lz  楼主| 发表于 2016-2-7 12:41:41 | 显示全部楼层
sunflover 发表于 2016-2-3 18:29
这个很好理解,你在自身dll中FreeLibrary肯定是失败的,因为你本身代码还在dll中执行。
但是创建一个线程 ...

谢谢~~~言之有理~~~
83_avatar_middle
在线会员 发表于 2016-2-15 01:15:30 | 显示全部楼层
戰Mars神 发表于 2016-2-7 12:41
谢谢~~~言之有理~~~


对于DLL的拆卸,其实有一个API是专门用来干这事的。
象这样的。
FreeLibraryAndExitThread(dllinst, 0);

这在写DLL注入和拆卸时经常用到。所以自身拆卸自身是可以的。百度一下这个API吧,它就是专门用来拆卸自身的。
47_avatar_middle
在线会员 发表于 2016-2-16 11:59:48 | 显示全部楼层
应该是FreeLibrary 的时候,句柄为NULL ,可以在FreeLibrary 时候判断
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-8-21 23:04

Powered by Discuz! X3.4

© 2009-2019 cctry.com

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