显式卸载延迟加载的 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

请参见

概念

链接器的延迟加载 DLL 支持