当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何获取当前正在执行的代码的HMODULE?》经验,为你挑选了2个好方法。

我有一个静态库,可以链接到a .exe或a .dll.在运行时,我希望我的库函数可以获取HMODULE静态库代码链接到的任何内容.

我目前使用以下技巧(灵感来自此论坛):

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

    return reinterpret_cast(mbi.AllocationBase);
}

有没有更好的方法来做这个看起来不那么hacky?

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



1> Serge Wautie..:
HMODULE GetCurrentModule()
{ // NB: XP+ solution!
  HMODULE hModule = NULL;
  GetModuleHandleEx(
    GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS,
    (LPCTSTR)GetCurrentModule,
    &hModule);

  return hModule;
}


@Adrian:或者使用GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT.
请注意,如果成功,则会增加模块的引用计数,因此您需要调用"FreeLibrary".

2> MSN..:

__ImageBase是链接器生成的符号,它是模块的DOS头(仅限MSVC).从那里你可以将其地址转换为HINSTANCEHMODULE.所以它比通过API更方便.

所以你只需要这样做:

EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#define HINST_THISCOMPONENT ((HINSTANCE)&__ImageBase)

来自http://blogs.msdn.com/oldnewthing/archive/2004/10/25/247180.aspx


错误... __ ImageBase是一个符号.如果在加载.dll或.exe时没有修复它,那么任何其他符号都不会被破坏.因此,使用它是有效的,因为它的地址在图像加载时被修复.
推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有