次の方法で共有


通知フック

ヘルパー ルーチンで以下のアクションが行われる直前に、通知フックが呼び出されます。

  • 格納されているライブラリ ハンドルが読み込み済みかどうかを確認します。

  • LoadLibrary を呼び出して、DLL を読み込みます。

  • GetProcAddress を呼び出して、プロシージャのアドレスを取得します。

  • 遅延インポート読み込みサンクに制御を返します。

通知フックは、次のいずれかの方法で有効にします。

  • 通知を受け取る独自の関数を指すように初期化した、新しい定義のポインター __pfnDliNotifyHook2 を指定します。

    または

  • プログラムで遅延読み込みされる DLL が呼び出される前に、フック関数をポインター __pfnDliNotifyHook2 に設定します。

通知が dliStartProcessing である場合、フック関数では以下の値が返されます。

  • NULL
    既定のヘルパーで DLL の読み込みが処理されます。 これは情報だけが目的の場合に便利です。

  • 関数ポインター
    既定の遅延読み込み処理がバイパスされます。 したがって、独自の読み込みハンドラーを使用できます。

通知が dliNotePreLoadLibrary である場合、フック関数では以下の値が返されます。

  • 0。情報通知だけが必要な場合に返されます。

  • 読み込まれた DLL の HMODULE。DLL 自体が読み込まれた場合に返されます。

通知が dliNotePreGetProcAddress である場合、フック関数では以下の値が返されます。

  • 0。情報通知だけが必要な場合に返されます。

  • インポートされた関数のアドレス。フック関数でアドレス自体が取得される場合に返されます。

通知が dliNoteEndProcessing である場合は、フック関数の戻り値は無視されます。

このポインターを 0 以外に初期化すると、遅延読み込みヘルパーは、実行中に特定の通知ポイントで関数を呼び出します。 関数ポインターの定義は次のとおりです。

// 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 構造体と通知値がフック関数に渡されます。 このデータは、遅延読み込みヘルパー ルーチンが使用するデータと同じです。 通知値は、「構造体と定数の定義」で定義されている値の 1 つです。

参照

概念

エラー処理と通知