如何获得我自己的代码模块句柄?

时间:2008-09-23 07:57:00

标签: winapi dll

  

可能重复:
  How do I get the HMODULE for the currently executing code?

我正在尝试在自己的模块中找到资源。如果这个模块是一个可执行文件,那很简单 - GetModuleHandle(NULL)返回“main”模块的句柄。

然而,我的模块是由另一个可执行文件加载的DLL。所以GetModuleHandle(NULL)会将模块句柄返回给那个可执行文件,这显然不是我想要的。

有没有办法确定包含当前运行代码的模块的模块句柄?在调用GetModuleHandle()时使用DLL的名称对我来说似乎是一个黑客攻击(如果有问题的代码被移植到不同的DLL中,则不易维护。)

3 个答案:

答案 0 :(得分:13)

将模块手柄存放在DllMain中,然后在实际需要时使用。许多框架(例如,MFC)自动执行此操作。

答案 1 :(得分:6)

如果DLL与MFC链接,那么有一种方法可以获取调用某个函数的DLL实例:

void dll_function()
  {
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  HINSTANCE dll_instance = AfxGetInstanceHandle();
  }

答案 2 :(得分:1)

如前所述,这可以通过保存传入DllMain函数的模块句柄来完成。

但是还有其他原因可以保存句柄。

例如,如果您决定使用资源链接器将资源绑定到DLL,则需要此模块句柄才能通过 LoadResource 函数API获取这些资源。