Descarregando de maneira explícita uma DLL carregada com atraso
/delay: descarregar a opção do vinculador permite que você descarregar uma DLL que foi carregado atraso. Por padrão, quando seu código descarrega o DLL (usando /delay:unload e __FUnloadDelayLoadedDLL2), as importações atraso- carregadas permanecem na tabela de endereço (IAT) de importação. No entanto, se você usar /delay:unload na linha de comando do vinculador, a função auxiliar dará suporte a descarga explícito da DLL, redefinindo o IAT ao seu formato original; os ponteiros agora inválidos serão substituídos. O IAT é um campo em ImgDelayDescr que contém o endereço de uma cópia original IAT (se houver).
Exemplo
Código
// 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");
}
Comentários
Observações importantes em descarregar uma DLL atraso- carregado:
Você pode localizar a implementação da função __FUnloadDelayLoadedDLL2 no arquivo \VC7\INCLUDE\DELAYHLP.CPP.
O parâmetro de nome da função de __FUnloadDelayLoadedDLL2 deve corresponder exatamente (inclusive) casos que a biblioteca de importação (contém a cadeia de caracteres também está na tabela de importação na imagem). Você pode exibir o conteúdo da biblioteca de importação com DUMPBIN /DEPENDENTS. Se uma correspondência sem diferenciação de maiúsculas e minúsculas de cadeia de caracteres for desejada, você pode atualizar __FUnloadDelayLoadedDLL2 para usar uma das funções de cadeia de caracteres de CRT ou de uma chamada à API do windows.
Consulte Descarregando DLL Atraso- carregado para obter mais informações.