Scaricamento di una DLL a caricamento ritardato

Mediante il supporto del caricamento ritardato predefinito è possibile verificare se i descrittori per il caricamento ritardato dispongono di un puntatore e di una copia della tabella di indirizzi di importazione (IAT) originale nel campo pUnloadIAT. In tal caso, un puntatore al descrittore di caricamento ritardato delle importazioni verrà salvato in un elenco. In questo modo, la funzione di supporto consente di individuare la DLL mediante il nome e di effettuarne lo scaricamento esplicito.

Di seguito sono indicate le strutture e le funzioni associate per lo scaricamento esplicito di una DLL a caricamento ritardato.

//
// 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 struttura UnloadInfo viene implementata mediante una classe C++ per la quale è previsto l'utilizzo delle implementazioni LocalAlloc e LocalFree rispettivamente come operatori new e delete. Queste opzioni sono conservate in un elenco collegato standard con intestazione __puiHead.

Quando viene chiamata la funzione __FUnloadDelayLoadedDLL, viene effettuato un tentativo di ricerca del nome fornito nell'elenco delle DLL caricate (è necessaria una corrispondenza esatta). Se la ricerca ha esito positivo, la copia della tabella IAT in pUnloadIAT viene sovrapposta alla tabella IAT in esecuzione per ripristinare i puntatori ai thunk, la libreria viene liberata mediante FreeLibrary, il record UnloadInfo corrispondente viene scollegato dall'elenco ed eliminato e infine viene restituito TRUE.

Per l'argomento della funzione __FUnloadDelayLoadedDLL2 viene applicata la distinzione fra maiuscole e minuscole. È possibile, ad esempio, specificare:

__FUnloadDelayLoadedDLL2("user32.DLL");

e non:

__FUnloadDelayLoadedDLL2("User32.DLL");.

Vedere anche

Riferimenti

Informazioni sulla funzione di supporto