2010-01-24 100 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