Явная выгрузка библиотеки DLL, загруженной с задержкой

Параметр компоновщика /delay:unload позволяет выгружать библиотек DLL, загруженную с задержкой. По умолчанию, когда код выгружает библиотеку DLL (используя /delay:unload и __FUnloadDelayLoadedDLL2), импортирование, загружаемое с задержкой, остается в таблице импорта адресов (IAT). Тем не менее, при использовании в командной строке построителя /delay:unload, функция помощника будет поддерживать явную выгрузку библиотеки 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, загруженной с задержкой:

  • Описание процесса реализации функции __FUnloadDelayLoadedDLL2 можно найти в файле \VC7\INCLUDE\DELAYHLP.CPP.

  • Имя параметра функции __FUnloadDelayLoadedDLL2 должно полностью совпадать (включая регистр) с содержимым библиотеки импорта (эта строка тоже находится в таблице импорта образа). Содержимое библиотеки импорта можно посмотреть с использованием параметра DUMPBIN /DEPENDENTS. В нечувствительных к регистру строках совпадение не обязательно, __FUnloadDelayLoadedDLL2 можно обновить для использования функций CRT-строки или вызова Windows API.

Дополнительные сведения см. в разделе Выгрузка библиотеки DLL, загруженной с задержкой.

См. также

Основные понятия

Поддержка компоновщика для DLLs, загружаемых с задержкой