2010-01-24 276 views
14

我在VC创建DLL ++是Win32项目如何从DLL获取HINSTANCE?

DllMain函数是

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

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

HMODULE和HINSTANCE是否一样?

如何获得HINSTANCE?

回答

21

摘录从书Windows通过C/C++ [1]

注意事实证明,HMODULE s和HINSTANCE s完全一样。如果函数的文档指示需要HMODULE,则可以传递HINSTANCE,反之亦然。有两种数据类型,因为在16位Windows HMODULE S和HINSTANCE S来标识不同的事情

[1]里克特,杰弗里和Nasarre,克里斯托弗,Windows通过C/C++,第5版,Redmond:Microsoft Press 2008,第74页

+2

更多的信息在这里:http://blogs.msdn.com/oldnewthing/archive/2004/06/14/155107.aspx – Chad 2010-01-24 10:29:39

+2

Win32,HINSTANCE和HMODULE都只是模块的基地址。 – Chad 2010-01-24 10:31:54

3

我认为这些都是一样的。如果你想运行的进程(EXE)的HINSTANCE,你应该使用

GetModuleHandle(NULL); 
+4

这不会返回** D的'HMODULE' LL **,这是OP要求的。 – IInspectable 2015-04-22 08:08:43

+0

这不适用于dll。 – rmcclellan 2017-11-30 23:18:14

1

从dll调用GetModuleHandle(NULL)将返回启动DLL的EXE的Hinstanc;因为它在MSDN的描述

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

+4

链接的网站已被删除。这是另一篇关于同一主题的有用文章:http://www.codeguru.com/cpp/w-p/dll/tips/article.php/c3635 – 2010-11-02 21:06:42

4

Microsoft链接

#include "windows.h" 
EXTERN_C IMAGE_DOS_HEADER __ImageBase; 
#pragma warning(disable: 4047) 
HINSTANCE hInstance = (HINSTANCE)&__ImageBase; 
#pragma warning(default: 4047) 
+0

如果DLL被重新定位,该怎么办? – karliwson 2017-03-04 19:50:01