显式卸载延迟加载的 DLL
/delay:unload 链接器选项使您能够卸载被延迟加载的 DLL。 默认情况下,当代码卸载 DLL 时(使用 /delay:unload 和 __FUnloadDelayLoadedDLL2),延迟加载的导入将保留在导入地址表 (IAT) 中。 但是,如果您在链接器命令行上使用 /delay:unload,Helper 函数将支持显式卸载 DLL,将 IAT 重置为其原始格式;当前无效的指针将被覆盖。 IAT 是 ImgDelayDescr 中的一个字段,它包含原始 IAT 副本(如果存在)的地址。
示例
代码
// 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");
}
注释
关于卸载延迟加载的 DLL 的重要说明:
在文件 \VC7\INCLUDE\DELAYHLP.CPP 中可以找到 __FUnloadDelayLoadedDLL2 函数的实现。
__FUnloadDelayLoadedDLL2 函数的名称参数必须与导入库中所包含的名称参数完全匹配,包括大小写匹配,该字符串也显示在映像中的导入表中。 可以用 DUMPBIN /DEPENDENTS 查看导入库中的内容。 如果匹配时不需要区分大小写,可更新 __FUnloadDelayLoadedDLL2 以使用其中一个 CRT 字符串函数或 Windows API 调用。
有关更多信息,请参见卸载延迟加载的 DLL。