2010-01-24 17 views
14

Stworzyłem DLL w VC++ jako projekt Win32Jak mogę uzyskać HINSTANCE z biblioteki DLL?

funkcji DllMain jest

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

Teraz muszę HINSTANCE DLL, które muszą być przekazywane do funkcji Win32.

Czy HMODULE i HINSTANCE samo?

Jak mogę uzyskać HINSTANCE?

Odpowiedz

21

Fragment z książki Okna Via C/C++ [1]

Note Jak się okazuje, HMODULE s i HINSTANCE s to dokładnie to samo. Jeśli dokumentacja dla funkcji wskazuje, że wymagane jest HMODULE, można zdać HINSTANCE i vice versa. Istnieją dwa typy danych, ponieważ w 16-bitowym systemie Windows HMODULE s i HINSTANCE s zidentyfikowano różne rzeczy

[1] Richter, Jeffery i Nasarre Christophe, Okna Via C/C++, 5th Ed Redmond. Microsoft Press 2008, s 74

+2

Więcej informacji tutaj: http://blogs.msdn.com/oldnewthing/archive/2004/06/14/155107.aspx – Chad

+2

Win32, HINSTANCE i HMODULE są zarówno tylko adres bazowy modułu. – Chad

3

myślę, że są one takie same. Jeśli chcesz HINSTANCE procesu biegania (EXE), należy użyć

GetModuleHandle(NULL); 
+4

To nie zwraca 'HMODULE' of a ** D LL **, o co prosił OP. – IInspectable

+0

To nie działa dla biblioteki dll. – rmcclellan

1

Wywołanie GetModuleHandle (null) z dll zwróci Hinstanc z EXE, który rozpoczął DLL; aby uzyskać HINSTANCE dla dll curently uruchomiony spróbuj to wskazówka:

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

+4

Połączona witryna została usunięta. Oto kolejny przydatny artykuł na ten sam temat: http://www.codeguru.com/cpp/w-p/dll/tips/article.php/c3635 –

4

Microsoft łącznik specyficzny

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

Co się stanie, jeśli biblioteka DLL zostanie przeniesiona? – karliwson

Powiązane problemy