Descarregar uma DLL atrasada-carregada
O auxiliar de carregamento de atraso padrão fornecido pelo verifica se os descritores de carregamento de atraso tem um ponteiro e uma cópia da tabela de endereço de importação original (IAT) no campo pUnloadIAT. Em caso afirmativo, ele salvará um ponteiro em uma lista para o descritor de atraso de importação. Isso permite que a função auxiliar localizar a DLL pelo nome, para oferecer suporte a descarregamento essa DLL explicitamente.
Aqui estão as funções para explicitamente descarregar uma DLL atrasada-carregada e estruturas associadas:
//
// 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;
A estrutura UnloadInfo é implementada usando uma classe C++ que usa LocalAlloc e LocalFree implementações como seu operador nova e o operador Excluir respectivamente. Essas opções são mantidas em uma lista vinculada padrão, usando o __puiHead como a cabeça da lista.
__FUnloadDelayLoadedDLL de chamada tentará localizar o nome é fornecer na lista de DLLs carregadas (uma correspondência exata é necessária). Se encontrado, a cópia do IAT no pUnloadIAT será copiada sobre o IAT em execução para restaurar os ponteiros de conversão, a biblioteca é liberada com FreeLibrary, a correspondência UnloadInfo registro é desvinculado da lista e excluído, e é retornado verdadeiro.
O argumento para o __FUnloadDelayLoadedDLL2 da função diferencia maiúsculas de minúsculas. Por exemplo, você especificaria:
__FUnloadDelayLoadedDLL2("user32.DLL");
e não:
__FUnloadDelayLoadedDLL2("User32.DLL");.