GetProcAddress动态加载某个DLL里的导出函数时,DllMain和导出函数的加载顺序.

dibotiger 2010-12-19 07:28:13
搞得头晕了.特来请教.

GetProcAddress动态加载某个DLL里的导出函数时,
如果这个DLL没有DllMain,或则DLL_PROCESS_ATTACH下没有要执行代码.
则当然不存在上面这样的问题.DLL就像一个可随时调用的功能LIB库。


很不幸, 我的DLL不仅有DllMain, 而且DLL_PROCESS_ATTACH下还有要执行的代码.
更要命的是,这里的代码和导出函数里的代码访问的是同一个由"#pragma data_seg"
共享的某个变量.并对这个变量进行修改。


所以这里就产生了这个简直是地狱般的先后问题:

到底加载导出函数的时候,
1是先执行导出函数里的代码,在执行DllMain下L_PROCESS_ATTACH的代码?
2.反之.


增加了些测试代码, 好像是1的情况,特来求证!


...全文
215 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
weiwuyuan 2011-12-22
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 weiwuyuan 的回复:]
引用 4 楼 wltg2001 的回复:
第一:任何DLL都会有DllMain的。
第二:DllMain是在调用LoadLibrary时调用的,并不是在GetProcAddress时调用的,换句话说,当你调用DLL中的导出函数时,DllMain早已经调用过了。


第1个对吧?DLLMain()函数是可以缺省的,
[/Quote]

打错了,是:
第1个不对
weiwuyuan 2011-12-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wltg2001 的回复:]
第一:任何DLL都会有DllMain的。
第二:DllMain是在调用LoadLibrary时调用的,并不是在GetProcAddress时调用的,换句话说,当你调用DLL中的导出函数时,DllMain早已经调用过了。
[/Quote]

第1个对吧?DLLMain()函数是可以缺省的,
dibotiger 2010-12-20
  • 打赏
  • 举报
回复
感谢诸位回复.的确是晕了.

为了避免后来者继续犯晕,提醒如下:


VISTA以后的Windows,由于某些进程的SESSION是隔离的,不同Session里的进程
不具有"由"#pragma data_seg共享的某个变量"的特性. 这也是我搞晕到测试出现谬论的原因所在.

wltg2001 2010-12-19
  • 打赏
  • 举报
回复
第一:任何DLL都会有DllMain的。
第二:DllMain是在调用LoadLibrary时调用的,并不是在GetProcAddress时调用的,换句话说,当你调用DLL中的导出函数时,DllMain早已经调用过了。
缘来是梦 2010-12-19
  • 打赏
  • 举报
回复
总而言之, 先执行DLLMain()
nicklisir 2010-12-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 csx007700 的回复:]
先执行PROCESS_ATTACH的代码,因为LoadLibrary的时候会执行DLLMain。
[/Quote]
+1
csx007700 2010-12-19
  • 打赏
  • 举报
回复
先执行PROCESS_ATTACH的代码,因为LoadLibrary的时候会执行DLLMain。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧