如何获得当前所在的DLL模块名称

起因:
    因为工作需要,写了一个小工具,嵌入到各个项目中(这些项目都是DLL项目).然后,在这个工具可以输出一些信息到日志文件.当然,输出信息需要标明这些信息来自哪个程序模块.首先,就想到了GetModuleFileName,一查MSDN,第一个参数hModule无法提供,如果提供NULL,只能得到创建进程的那个EXE文件。又顺藤摸瓜,找到了GetModuleHandle函数。然而,问题仍然存在:GetModuleHandle需要一个 lpModuleName参数,这不是死循环了么?想寻觅一个GetCurrentModuleHandle,没有;google,无果。郁闷之余,看到HMODULE的本质:模块的起始地址。
    至此,至少我可以有个笨办法解决了:枚举所有模块,排序。然后用当前函数地址去匹配模块句柄,比函数地址小的句柄中最大的那个句柄,就是当前模块句柄。方法有点笨,但是可行。
    忽然想到,GetModuleHandleEx是不是有额外的功能呢?查阅之下,大喜,于是如下获得当前模块文件名: 
        HMODULE hModule = NULL;
        GetModuleHandleEx(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
            (LPCSTR)&getLogFile, //这是函数名,强转
           &hModule);
        DWORD len = GetModuleFileNameA(hModule, buffer, sizeof buffer);

成功!猜想,之所以要提供一个函数地址作为参考,大概和我想到的方法也类似吧?只是也许它内部不需要枚举,直接访问模块列表就可以了。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值