我在VC ++中创建了一个DLL作为Win32项目
DLLMAIN函数是
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
现在我需要DLL的HINSTANCE,需要传递给Win32函数。
HMODULE和HINSTANCE相同吗?
我如何获得HINSTANCE?
答案 0 :(得分:22)
摘自Windows Via C / C ++ [1]
一书注意事实证明, HMODULE 和 HINSTANCE 是完全相同的。如果函数的文档表明需要 HMODULE ,则可以传递 HINSTANCE ,反之亦然。有两种数据类型,因为在16位Windows HMODULE 和 HINSTANCE 中识别出不同的东西
[1] Richter,Jeffery和Nasarre,Christophe, Windows Via C / C ++ ,5th ed,Redmond:Microsoft Press 2008,pp.74
答案 1 :(得分:5)
Microsoft链接器特定
#include "windows.h"
EXTERN_C IMAGE_DOS_HEADER __ImageBase;
#pragma warning(disable: 4047)
HINSTANCE hInstance = (HINSTANCE)&__ImageBase;
#pragma warning(default: 4047)
答案 2 :(得分:4)
我认为这些都是一样的。如果你想要运行进程(exe)的HINSTANCE,你应该使用
GetModuleHandle(NULL);
答案 3 :(得分:1)
从dll调用GetModuleHandle(NULL)将返回启动DLL的EXE的Hinstanc;为了获得运行dll的Hinstance尝试这个技巧:
答案 4 :(得分:1)
每个DLL至少具有一个头文件,例如MyDll.h和一个相应的实现文件MyDll.cpp。打开头文件并添加
extern HMODULE hDllModule;//or whatever name you like
现在打开MyDll.cpp文件。有一个功能DLLMAIN。在HMODULE hDllModule;
之前添加,并在hDllModuleDll = hModule;
之前插入return true;
。您的代码将如下所示:
HMODULE hDllModuleDll;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
hDllModuleDll = hModule;
return TRUE;
}
在像::GetModuleFileNameW(hModule, PathFile, MAX_PATH);
这样的函数中,需要DLL的HMODULE
,您可以传递全局变量hDllModule
。
答案 5 :(得分:0)
在MSDN中描述的DllMain函数:
BOOL WINAPI DllMain(
__in HINSTANCE hinstDLL,
__in DWORD fdwReason,
__in LPVOID lpvReserved
);
http://msdn.microsoft.com/en-us/library/ms682583%28v=vs.85%29.aspx
答案 6 :(得分:0)
为了完整起见,补充其他答案。
DllMain
的实际签名具有 HINSTANCE
参数,而不是 HMODULE
参数。但是,Visual Studio DLL 模板至少从 Visual Studio 2008 开始就使用 HMODULE
生成签名,但我认为这是一个小错误。 VC6 使用 HANDLE
生成代码(即使 HINSTANCE
和 HMODULE
都存在)。不会引起问题的原因是因为HINSTANCE
and HMODULE
are now exactly the same thing。不幸的是,我无法找到可以证实这一点的足够古老的 MSDN 文档版本。
所以答案是:您将 HINSTANCE
作为 DllMain
的参数。
我个人有点喜欢 HMODULE 和 HINSTANCE 之间的区别,因为它吸引我,因为它是良好的代码卫生。这有点像使用 const
。但是,一个新问题出现了:鉴于您的 HINSTANCE
,您如何以“卫生”的方式获得您的 HMODULE
?
windowsx.h
标头定义了 GetInstanceModule
,它现在是一个仅将 HINSTANCE
强制转换为 HMODULE
的宏。它的存在只是为了代码兼容性,以及一堆非常相似的宏。