打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
如何获得当前所在的DLL模块名称
userphoto

2014.02.16

关注
起因:
    因为工作需要,写了一个小工具,嵌入到各个项目中(这些项目都是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);

成功!猜想,之所以要提供一个函数地址作为参考,大概和我想到的方法也类似吧?只是也许它内部不需要枚举,直接访问模块列表就可以了。
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
获得当前的模块名或者模块句柄
DLL高级技术
说说实例句柄和模块句柄的区别
四种方法实现VC枚举系统当前进程
C++与Fortran混合语言编程中动态连接库的调用
鼠标屏幕取词技术的原理和实现 - 编程开发 - Visual C - 新云网络
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服