Winapi 如何获得我自己的代码';什么是模块句柄?

Winapi 如何获得我自己的代码';什么是模块句柄?,winapi,dll,Winapi,Dll,可能重复: 我试图在我自己的模块中找到一个资源。如果这个模块是一个可执行文件,那就很简单-GetModuleHandle(NULL)返回“main”模块的句柄 然而,我的模块是由另一个可执行文件加载的DLL。因此GetModuleHandle(NULL)将返回该可执行文件的模块句柄,这显然不是我想要的 有没有办法确定包含当前运行代码的模块的模块句柄?在调用GetModuleHandle()时使用DLL的名称对我来说似乎是一种黑客行为(并且在所讨论的代码被移植到不同的DLL中时不容易维护)。在D

可能重复:

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

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


有没有办法确定包含当前运行代码的模块的模块句柄?在调用
GetModuleHandle()
时使用DLL的名称对我来说似乎是一种黑客行为(并且在所讨论的代码被移植到不同的DLL中时不容易维护)。

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

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

但是,还有其他原因可以解释为什么要保存句柄


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

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

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

谢谢你的建议。对于MFC DLL,这是一个很好的解决方案。但我的DLL大约有一半不是,所以我也需要其他东西。我还没有看过MFC源代码,但它们可能在加载DLL时也存储了句柄。你能提供一些关于这个解决方案的详细信息吗?我遇到了与线程作者相同的问题,但我不知道DllMain是什么,何时调用,如何存储我需要的信息。@MarcinK.-这就解释了什么是德勒曼。它是模块的一个可选入口点,您可以创建它,并在全局变量中存储模块句柄。