如何获取当前执行代码的 HMODULE?

新手上路,请多包涵

我有一个静态库,可以链接到 .exe.dll 。在运行时,我希望我的库函数之一获得 HMODULE 用于静态库代码已链接到的任何内容。

我目前使用以下技巧(受此 论坛 启发):

 const HMODULE GetCurrentModule()
{
    MEMORY_BASIC_INFORMATION mbi = {0};
    ::VirtualQuery( GetCurrentModule, &mbi, sizeof(mbi) );

    return reinterpret_cast<HMODULE>(mbi.AllocationBase);
}

有没有更好的方法来做到这一点,看起来不那么hacky?

(注意:这样做的目的是加载一些我知道我的用户将与我的静态库同时链接的 Win32 资源。)

原文由 pauldoo 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 995
2 个回答
HMODULE GetCurrentModule()
{ // NB: XP+ solution!
  HMODULE hModule = NULL;
  GetModuleHandleEx(
    GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
    (LPCTSTR)GetCurrentModule,
    &hModule);

  return hModule;
}

原文由 Serge Wautier 发布,翻译遵循 CC BY-SA 2.5 许可协议

我会看 GetModuleHandleEx() 使用标志 GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 。 It looks like you can change your GetCurrentModule() to call this routine instead of VirtualQuery() , and pass the address of GetCurrentModule() as the lpModuleName argument .

预计到达时间:

 const HMODULE GetCurrentModule()
{
    DWORD flags = GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS;
    HMODULE hm = 0;
    ::GetModuleHandleEx( flags, reinterpret_cast<LPCTSTR>( GetCurrentModule ), &hm );
    return hm;
}

我没有尝试过,但我认为这会做你想要的。

原文由 Rob K 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题