如何从DLL获取HINSTANCE?

时间:2010-01-24 10:15:43

标签: winapi visual-c++

我在VC ++中创建了一个DLL作为Win32项目

DLLMAIN函数是

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}

现在我需要DLL的HINSTANCE,需要传递给Win32函数。

HMODULE和HINSTANCE相同吗?

我如何获得HINSTANCE?

7 个答案:

答案 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尝试这个技巧:

http://www.dotnet247.com/247reference/msgs/13/65259.aspx

答案 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 生成代码(即使 HINSTANCEHMODULE 都存在)。不会引起问题的原因是因为HINSTANCE and HMODULE are now exactly the same thing。不幸的是,我无法找到可以证实这一点的足够古老的 MSDN 文档版本。

所以答案是:您将 HINSTANCE 作为 DllMain 的参数。

我个人有点喜欢 HMODULE 和 HINSTANCE 之间的区别,因为它吸引我,因为它是良好的代码卫生。这有点像使用 const。但是,一个新问题出现了:鉴于您的 HINSTANCE,您如何以“卫生”的方式获得您的 HMODULE

windowsx.h 标头定义了 GetInstanceModule,它现在是一个仅将 HINSTANCE 强制转换为 HMODULE 的宏。它的存在只是为了代码兼容性,以及一堆非常相似的宏。