Déchargement d'une DLL à chargement différé
L'assistance de chargement différé fournie par défaut vérifie que les descripteurs de chargement différé ont un pointeur et une copie de la table des adresses d'importation (IAT) d'origine dans le champ pUnloadIAT. Si c'est bien le cas, l'assistance enregistre un pointeur dans une liste dans le descripteur de différé des importations. Cela permet à la fonction d'assistance de rechercher la DLL par son nom pour prendre en charge le déchargement explicite de cette DLL.
Voici les structures et fonctions associées permettant le déchargement explicite d'une DLL à chargement différé :
//
// Unload support from delayimp.h
//
// routine definition; takes a pointer to a name to unload
ExternC
BOOL WINAPI
__FUnloadDelayLoadedDLL2(LPCSTR szDll);
// structure definitions for the list of unload records
typedef struct UnloadInfo * PUnloadInfo;
typedef struct UnloadInfo {
PUnloadInfo puiNext;
PCImgDelayDescr pidd;
} UnloadInfo;
// from delayhlp.cpp
// the default delay load helper places the unloadinfo records in the
// list headed by the following pointer.
ExternC
PUnloadInfo __puiHead;
La structure UnloadInfo est implémentée à l'aide d'une classe C++ qui utilise les implémentations de LocalAlloc et LocalFree respectivement comme ses opérateurs new et delete. Ces options sont conservées dans une liste liée standard avec __puiHead comme tête de liste.
L'appel de __FUnloadDelayLoadedDLL résulte en une tentative de recherche du nom que vous fournissez dans la liste des DLL chargées (une correspondance exacte est nécessaire). Si ce nom est trouvé, la copie de la table IAT dans pUnloadIAT est copiée sur la table IAT en cours d'exécution pour restaurer les pointeurs de thunk, la bibliothèque est libérée avec FreeLibrary, l'enregistrement UnloadInfo correspondant est détaché de la liste et supprimé et, enfin, la valeur TRUE est retournée.
L'argument de la fonction __FUnloadDelayLoadedDLL2 respecte la casse. Par exemple, vous spécifiez :
__FUnloadDelayLoadedDLL2("user32.DLL");
et non :
__FUnloadDelayLoadedDLL2("User32.DLL");.