Scaricamento esplicito di una DLL a caricamento ritardato
Aggiornamento: novembre 2007
L'opzione del linker /delay:unload consente di scaricare una DLL sottoposta a caricamento ritardato. Per impostazione predefinita, se nel codice viene scaricata la DLL mediante /delay:unload e __FUnloadDelayLoadedDLL2, le importazioni a caricamento ritardato rimangono nella tabella di indirizzi di importazione (IAT, import address table). Se tuttavia si utilizza /delay:unload dalla riga di comando del linker, la funzione di supporto consentirà anche lo scaricamento esplicito della DLL, ripristinando il formato originale della IAT e sovrascrivendo i puntatori non più validi. IAT è un campo di ImgDelayDescr contenente l'indirizzo di una copia della tabella IAT originale (se esistente).
Esempio
Codice
// link with /link /DELAYLOAD:MyDLL.dll /DELAY:UNLOAD
#include <windows.h>
#include <delayimp.h>
#include "MyDll.h"
#include <stdio.h>
#pragma comment(lib, "delayimp")
#pragma comment(lib, "MyDll")
int main()
{
BOOL TestReturn;
// MyDLL.DLL will load at this point
fnMyDll();
//MyDLL.dll will unload at this point
TestReturn = __FUnloadDelayLoadedDLL2("MyDll.dll");
if (TestReturn)
printf_s("\nDLL was unloaded");
else
printf_s("\nDLL was not unloaded");
}
Commenti
Note importanti relative allo scaricamento di una DLL a caricamento ritardato:
L'implementazione della funzione __FUnloadDelayLoadedDLL2 è contenuta nel file \VC7\INCLUDE\DELAYHLP.CPP.
Il parametro nome della funzione __FUnloadDelayLoadedDLL2 deve corrispondere esattamente al contenuto della libreria di importazione. La stringa è presente anche nella tabella di importazione all'interno dell'immagine. Il contenuto della libreria di importazione può essere visualizzato con DUMPBIN /DEPENDENTS. Per ottenere una corrispondenza di stringa senza distinzione tra maiuscole e minuscole, è possibile aggiornare __FUnloadDelayLoadedDLL2 in modo da utilizzare le funzioni di stringa CRT o una chiamata alle API di Windows.
Per ulteriori informazioni, vedere Scaricamento di una DLL a caricamento ritardato.