Freigeben über


GetModuleHandleExW-Funktion (libloaderapi.h)

Ruft ein Modulhandle für das angegebene Modul ab und erhöht die Referenzanzahl des Moduls, es sei denn, GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT angegeben ist. Das Modul muss vom aufrufenden Prozess geladen worden sein.

Syntax

BOOL GetModuleHandleExW(
  [in]           DWORD   dwFlags,
  [in, optional] LPCWSTR lpModuleName,
  [out]          HMODULE *phModule
);

Parameter

[in] dwFlags

Dieser Parameter kann null oder mindestens einer der folgenden Werte sein. Wenn die Referenzanzahl des Moduls erhöht wird, muss der Aufrufer die FreeLibrary-Funktion verwenden, um die Referenzanzahl zu erhöhen, wenn das Modulhandle nicht mehr benötigt wird.

GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS (0x00000004)

Der parameter lpModuleName ist eine Adresse im Modul.

GET_MODULE_HANDLE_EX_FLAG_PIN (0x00000001)

Das Modul bleibt geladen, bis der Prozess beendet wird, unabhängig davon, wie oft FreeLibrary aufgerufen wird.

Diese Option kann nicht mit GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT verwendet werden.

GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT (0x00000002)

Die Referenzanzahl für das Modul wird nicht erhöht. Diese Option entspricht dem Verhalten von GetModuleHandle-. Übergeben Sie das abgerufene Modulhandle nicht an die FreeLibrary-Funktion; Dies kann dazu führen, dass die DLL vorzeitig nicht zugeordnet wird. Weitere Informationen finden Sie in den Hinweisen.

Diese Option kann nicht mit GET_MODULE_HANDLE_EX_FLAG_PIN verwendet werden.

[in, optional] lpModuleName

Der Name des geladenen Moduls (entweder eine .dll- oder .exe-Datei) oder eine Adresse im Modul (wenn dwFlags- GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS ist).

Wenn die Dateinamenerweiterung ausgelassen wird, wird bei einem Modulnamen die Standardbibliothekserweiterung .dll angefügt. Die Dateinamenzeichenfolge kann ein nachfolgendes Punktzeichen (.) enthalten, um anzugeben, dass der Modulname keine Erweiterung hat. Die Zeichenfolge muss keinen Pfad angeben. Achten Sie beim Angeben eines Pfads darauf, dass Umgekehrte Schrägstriche (\) und keine Schrägstriche (/) verwendet werden. Der Name wird (unabhängig von Groß-/Kleinschreibung) mit den Namen der Module verglichen, die derzeit im Adressraum des aufrufenden Prozesses zugeordnet sind.

Wenn dieser Parameter NULL ist, gibt die Funktion ein Handle für die Datei zurück, die zum Erstellen des aufrufenden Prozesses (.exe Datei) verwendet wird.

[out] phModule

Ein Handle für das angegebene Modul. Wenn die Funktion fehlschlägt, ist dieser Parameter NULL.

Die GetModuleHandleEx--Funktion ruft keine Handles für Module ab, die mit dem LOAD_LIBRARY_AS_DATAFILE-Flag geladen wurden. Weitere Informationen finden Sie unter LoadLibraryEx.

Rückgabewert

Wenn die Funktion erfolgreich ist, ist der Rückgabewert ungleich Null.

Wenn die Funktion fehlschlägt, ist der Rückgabewert null. Informationen zu erweiterten Fehlern finden Sie unter GetLastError.

Bemerkungen

Das zurückgegebene Handle ist nicht global oder vererbbar. Sie kann nicht dupliziert oder von einem anderen Prozess verwendet werden.

Wenn lpModuleName keinen Pfad enthält und mehrere geladene Module mit demselben Basisnamen und derselben Erweiterung vorhanden sind, können Sie nicht vorhersehen, welches Modulhandle zurückgegeben wird. Um dieses Problem zu umgehen, können Sie einen Pfad angeben, parallele Assemblysverwenden oder einen Speicherspeicherort anstelle eines DLL-Namens im parameter lpModuleName angeben.

Wenn dwFlags- GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT enthält, gibt die GetModuleHandleEx- funktion ein Handle an ein zugeordnetes Modul zurück, ohne die Referenzanzahl zu erhöhen. Wenn dieses Handle jedoch an die FreeLibrary-Funktion übergeben wird, wird die Referenzanzahl des zugeordneten Moduls verringert. Übergeben Sie daher kein Handle, das von GetModuleHandleEx- mit GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT an die FreeLibrary--Funktion zurückgegeben wird. Dies kann dazu führen, dass ein DLL-Modul vorzeitig nicht zugeordnet wird.

Wenn dwFlags GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT enthält, muss diese Funktion in einer Multithreadanwendung sorgfältig verwendet werden. Es besteht keine Garantie dafür, dass der Modulhandle zwischen dem Zeitpunkt, zu dem diese Funktion den Handle zurückgibt, und der Zeit, zu der es verwendet wird, gültig bleibt. Beispielsweise ruft ein Thread ein Modulhandle ab, aber bevor er den Handle verwendet, gibt ein zweiter Thread das Modul frei. Wenn das System ein anderes Modul lädt, könnte es den zuletzt freigegebenen Modulhandle wiederverwenden. Daher hätte der erste Thread ein Handle für ein anderes Modul als das beabsichtigte.

Um eine Anwendung zu kompilieren, die diese Funktion verwendet, definieren Sie _WIN32_WINNT als 0x0501 oder höher. Weitere Informationen finden Sie unter Verwenden der Windows-Header.

Anmerkung

Der libloaderapi.h Header definiert GetModuleHandleEx als Alias, der die ANSI- oder Unicode-Version dieser Funktion basierend auf der Definition der UNICODE-Präprozessorkonstante automatisch auswählt. Das Mischen der Verwendung des codierungsneutralen Alias mit Code, der nicht codierungsneutral ist, kann zu Nichtübereinstimmungen führen, die zu Kompilierungs- oder Laufzeitfehlern führen. Weitere Informationen finden Sie unter Konventionen für Funktionsprototypen.

Anforderungen

Anforderung Wert
mindestens unterstützte Client- Windows XP [nur Desktop-Apps]
mindestens unterstützte Server- Windows Server 2003 [Nur Desktop-Apps]
Zielplattform- Fenster
Header- libloaderapi.h (include Windows.h)
Library Kernel32.lib
DLL- Kernel32.dll

Siehe auch

Dynamic-Link Bibliotheksfunktionen

FreeLibrary-

GetModuleFileName-

LoadLibrary-

LoadLibraryEx-

Vertdll-APIs in VBS-Enklaven