14

可能重复:
如何获取当前执行代码的 HMODULE?

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

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

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

4

3 回答 3

13

在 DllMain 中将模块句柄提供给您时将其存储起来,然后在您实际需要时使用它。许多框架(例如,MFC)会自动执行此操作。

于 2008-09-23T08:04:42.987 回答
6

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

void dll_function()
  {
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  HINSTANCE dll_instance = AfxGetInstanceHandle();
  }
于 2011-08-10T16:29:29.917 回答
1

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

但是还有其他原因应该保存句柄。

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

于 2008-09-23T23:59:16.453 回答