Поделиться через


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

Обновлен: Ноябрь 2007

Вспомогательная функция отложенной загрузки, предоставляемая по умолчанию, выполняет проверку на предмет наличия в поле pUnloadIAT указателей дескриптора отложенной загрузки, а также копии исходной адресной таблицы импорта (IAT). Если результат проверки положительный, функция сохраняет указатель в списке дескрипторов отложенной загрузки. Таким образом, вспомогательная функция включается для поиска по именам библиотек DLL, чтобы обеспечить поддержку явной выгрузки библиотек DLL.

Далее приведены связанные структуры и функции для явной выгрузки библиотеки DLL, загруженной с задержкой:

//
// Unload support from delayimp.h
//

// routine definition; takes a pointer to a name to unload

ExternC
BOOL WINAPI
__FUnloadDelayLoadedDLL2(LPCSTR szDll);

// structure definitions for the list of unload records
typedef struct UnloadInfo * PUnloadInfo;
typedef struct UnloadInfo {
    PUnloadInfo     puiNext;
    PCImgDelayDescr pidd;
    } UnloadInfo;

// from delayhlp.cpp
// the default delay load helper places the unloadinfo records in the 
// list headed by the following pointer.
ExternC
PUnloadInfo __puiHead;

Структура UnloadInfo реализуется с помощью класса C++, использующего реализации LocalAlloc и LocalFree в качестве операторов создать и удалить соответственно. Данные параметры содержатся в стандартном связанном списке, в котором в качестве заголовка используется __puiHead.

При вызове __FUnloadDelayLoadedDLL будет выполнен поиск по имени, заданному в списке загруженных библиотек DLL (по точному совпадению). Если результат поиска положительный, копия IAT а UnloadIAT записывается поверх работающей IAT, чтобы восстановить указатели преобразователя, библиотека высвобождается посредством FreeLibrary, связывание соответствующей записи UnloadInfo списка отменяется, запись удаляется, и возвращается значение true.

Для аргумента функции __FUnloadDelayLoadedDLL2 регистр учитывается. Например, можно указать:

__FUnloadDelayLoadedDLL2("user32.DLL");

но не:

__FUnloadDelayLoadedDLL2("User32.DLL");.

См. также

Ссылки

Понятие вспомогательной функции