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


Обработчики уведомления

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

Обработчики уведомления вызываются перед выполнением следующих действий во вспомогательной подпрограмме.

  • С помощью сохраненного дескриптора библиотеки проверяется, загружена она или нет.

  • Вызывается метод LoadLibrary, чтобы попытаться загрузить библиотеку DLL.

  • Вызывается метод GetProcAddress для получения адреса процедуры.

  • Возвращение в преобразователь задержки импорта загрузки.

Обработчик уведомления включается следующим образом.

  • При предоставлении нового определения указателя __pfnDliNotifyHook2, который при инициализации указывает на собственную функцию, получающую уведомления.

    -или-

  • При присвоении указателю __pfnDliNotifyHook2 значения, равному адресу функции обработчика, перед любыми вызовами библиотеки DLL, которую программа загружает с задержкой.

При уведомлении dliStartProcessing, функция обработчика может возвратить:

  • NULL
    Вспомогательная подпрограмма, использующаяся по умолчанию, обрабатывает загрузку библиотеки DLL. Ее полезно вызывать только для получения сведений.

  • указатель на функцию
    Обход стандартной загрузки с задержкой. При этом можно использовать собственный обработчик загрузки.

При уведомлении dliNotePreLoadLibrary, функция обработчика может возвратить:

  • 0, если требуются только информационные уведомления.

  • Параметр HMODULE для загруженной DLL, если была загружена библиотека DLL.

При уведомлении dliNotePreGetProcAddress, функция обработчика может возвратить:

  • 0, если требуются только информационные уведомления.

  • Адрес функции импорта, если обработчик самостоятельно получает адрес.

При уведомлении dliNoteEndProcessing, возвращаемое значение функции обработчика игнорируется.

Если этот указатель инициализирован (значение не равно нулю), вспомогательная подпрограмма загрузки с задержкой вызывает функцию в определенных точках уведомления во время своего выполнения. Указатель функции имеет следующие определение:

// The "notify hook" gets called for every call to the
// delay load helper.  This allows a user to hook every call and
// skip the delay load helper entirely.
//
// dliNotify == {
//  dliStartProcessing |
//  dliNotePreLoadLibrary  |
//  dliNotePreGetProc |
//  dliNoteEndProcessing}
//  on this call.
//
ExternC
PfnDliHook   __pfnDliNotifyHook2;

// This is the failure hook, dliNotify = {dliFailLoadLib|dliFailGetProc}
ExternC
PfnDliHook   __pfnDliFailureHook2;

Уведомления передаются в структуре DelayLoadInfo в функцию обработчика, как и значение уведомления. Данные такие же, как и используемые вспомогательной подпрограммой загрузки с задержкой. Возможные значения уведомления определены в разделе Определения структур и констант.

См. также

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

Обработка ошибок и предупреждений