首页
社区
课程
招聘
[旧帖] [原创][邀请码已发]获取调用者代码所在的模块名字 0.00雪花
发表于: 2010-5-13 18:47 2822

[旧帖] [原创][邀请码已发]获取调用者代码所在的模块名字 0.00雪花

2010-5-13 18:47
2822
我们经常通过日志的方式来收集客户现场的软件执行情况。一般都封装一个trace.dll专门用来写日志。为了通用性,一般会在日志的开头加上模块名称等信息。问题是你如何在trace.dll中获得当前调用者所在的模块名称呢?尤其是很多时候你的代码是一个dll,多个dll会调用你的trace.dll来写日志,你如何区分是哪个dll在调用你?又或者是哪个exe在调用你?

首先,根据X86体系以及VC stdcall的调用约定,我们知道[ebp+4]保存的就是当前函数需要返回的地址,也就是你的调用者所在的地址空间。
然后,根据这个地址调用VirtualQuery 这个API函数来获取分配的内存的基地址。
最后,根据toolhelp系列函数来对比这个基地址属于哪个模块。

好了,道理很简单。具体代码大家看附件吧。
代码使用vc++ 2003编译

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
这个不通用~~
2010-5-13 23:47
0
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
看看学习学习
2010-5-14 07:29
0
雪    币: 219
活跃值: (34)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
能详细说说哪些方面不通用吗?以便我改进方案。
我现在这个方案主要针对x86体系Windows平台的。
因为trace.dll是std方式调用的,所以在上述范围内是通用的。
2010-5-14 08:37
0
雪    币: 268
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
GUX
5
谢谢了, 学习学习!
2010-5-14 08:39
0
游客
登录 | 注册 方可回帖
返回
//