2008-09-23 113 views
13

可能重复:
How do I get the HMODULE for the currently executing code?如何获取我自己的代码模块句柄?

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

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

有什么方法可以确定包含当前运行代码的模块的模块句柄吗?在对GetModuleHandle()的调用中使用DLL的名称对我来说似乎是一种攻击(并且在将代码移植到不同的DLL中时不易维护)。

回答

10

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

+0

请您提供有关此解决方案的更多细节?作为线程的作者,我遇到了同样的问题,但是我不知道DllMain是什么,它何时被调用,以及如何存储我需要的信息。 – 2017-04-27 13:12:49

+0

@MarcinK。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms682583(v=vs.85).aspx - 这解释了什么是DllMain。它是模块的一个可选入口点,您可以创建并执行诸如将模块句柄存储在全局变量中的操作。 – 2017-05-01 07:19:04

1

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

但还有其他一些原因,你应该保存手柄。

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

5

如果DLL与MFC链接那么有一种方式来获得DLL的实例中,一些功能被称为:

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