Aufrufkonventionen, Parameter und Rückgabetyp
Aktualisiert: November 2007
Der Prototyp der Hilfsfunktion lautet wie folgt:
FARPROC WINAPI __delayLoadHelper2(
PCImgDelayDescr pidd,
FARPROC * ppfnIATEntry
);
Dabei gilt:
pidd
Ein const-Zeiger auf eine ImgDelayDescr (vergleiche delayimp.h), der die Offsets für verschiedene importbezogene Daten, einen Timestamp für Bindungsinformationen und einen Satz von Attributen enthält, die weitere Informationen über den Inhalt des Deskriptors bereitstellen. Derzeit zeigt nur das dlattrRva-Attribut an, dass die Adressen im Deskriptor relative virtuelle Adressen (und keine virtuellen Adressen) sind.Informationen zur Definition der PCImgDelayDescr-Struktur finden Sie unter Struktur- und Konstantendefinitionen.
ppfnIATEntry
Ein Zeiger auf den Umsetzungsplatz in der Importadressentabelle (IAT) für verzögertes Laden, der mit der Adresse der importierten Funktion aktualisiert werden soll. Die Hilfsfunktion muss denselben Wert speichern, der von ihr an diese Stelle zurückgegeben wird.
Erwartete Rückgabewerte
Ist die Funktion erfolgreich, dann besteht der Rückgabewert aus der Adresse der importierten Funktion.
Tritt ein Fehler auf, dann löst sie eine Ausnahme aus und der Rückgabewert ist 0. Drei Typen von Ausnahmen können ausgelöst werden:
Ungültiger Parameter. Diese Ausnahme tritt auf, wenn die Attribute in pidd nicht richtig angegeben sind.
Fehler beim Aufruf von LoadLibrary für die angegebene DLL.
Fehler bei GetProcAddress.
Diese Ausnahmen müssen behandelt werden.
Hinweise
Die Aufrufkonvention der Hilfsfunktion ist __stdcall. Der Typ des Rückgabewerts ist nicht relevant, sodass FARPROC verwendet wird. Diese Funktion besitzt eine C-Bindung.
Der Rückgabewert der Hilfsfunktion für verzögertes Laden muss im Speicherort des übergebenen Funktionszeigers gespeichert werden, es sei denn, die Hilfsfunktion soll als Benachrichtigunghook verwendet werden. In diesem Fall muss der Code den geeigneten zurückzugebenden Funktionszeiger selbst ermitteln. Der Thunkcode, der dann vom Linker generiert wird, fasst diesen Rückgabewert als tatsächliches Importziel auf und springt direkt dorthin.
Beispiel
Im folgenden Code wird gezeigt, wie eine einfache Hilfsfunktion implementiert wird.
FARPROC WINAPI delayHook(unsigned dliNotify, PDelayLoadInfo pdli)
{
switch (dliNotify) {
case dliStartProcessing :
// If you want to return control to the helper, return 0.
// Otherwise, return a pointer to a FARPROC helper function
// that will be used instead, thereby bypassing the rest
// of the helper.
break;
case dliNotePreLoadLibrary :
// If you want to return control to the helper, return 0.
// Otherwise, return your own HMODULE to be used by the
// helper instead of having it call LoadLibrary itself.
break;
case dliNotePreGetProcAddress :
// If you want to return control to the helper, return 0.
// If you choose you may supply your own FARPROC function
// address and bypass the helper's call to GetProcAddress.
break;
case dliFailLoadLib :
// LoadLibrary failed.
// If you don't want to handle this failure yourself, return 0.
// In this case the helper will raise an exception
// (ERROR_MOD_NOT_FOUND) and exit.
// If you want to handle the failure by loading an alternate
// DLL (for example), then return the HMODULE for
// the alternate DLL. The helper will continue execution with
// this alternate DLL and attempt to find the
// requested entrypoint via GetProcAddress.
break;
case dliFailGetProc :
// GetProcAddress failed.
// If you don't want to handle this failure yourself, return 0.
// In this case the helper will raise an exception
// (ERROR_PROC_NOT_FOUND) and exit.
// If you choose you may handle the failure by returning
// an alternate FARPROC function address.
break;
case dliNoteEndProcessing :
// This notification is called after all processing is done.
// There is no opportunity for modifying the helper's behavior
// at this point except by longjmp()/throw()/RaiseException.
// No return value is processed.
break;
default :
return NULL;
}
return NULL;
}
/*
and then at global scope somewhere
PfnDliHook __pfnDliNotifyHook2 = delayHook;
*/