Явная выгрузка библиотеки 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, загруженной с задержкой.