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

来源:互联网 发布:excel表格相同数据筛选 编辑:程序博客网 时间:2024/05/19 22:50
起因:
    因为工作需要,写了一个小工具,嵌入到各个项目中(这些项目都是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);

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