__hook キーワード

ハンドラー メソッドをイベントに関連付けます。

Note

ネイティブ C++ のイベント属性は、標準 C++ と互換性がありません。 この属性は、/permissive- 準拠モードを指定するとコンパイルされません。

構文

long __hook(
    &SourceClass::EventMethod,
    source,
    &ReceiverClass::HandlerMethod
    [, receiver = this]
);

long __hook(
    interface,
    source
);

パラメーター

&SourceClass::EventMethod
イベント ハンドラー メソッドをフックする先のイベント メソッドへのポインター。

  • ネイティブ C++ イベント: SourceClass はイベント ソース クラスであり、EventMethod はイベントです。

  • COM イベント: SourceClass はイベント ソース インターフェイスであり、EventMethod はメソッドの 1 つです。

  • マネージド イベント: SourceClass はイベント ソース クラスであり、EventMethod はイベントです。

interface
event_receiver 属性の layout_dependent パラメーターが true である COM イベント レシーバーのみに対して、receiver にフックされているインターフェイス名。

source
イベント ソースのインスタンスへのポインター。 event_receiver で指定されているコード type に応じて、以下のいずれかの種類の source になります。

  • ネイティブ イベント ソース オブジェクト ポインター。

  • IUnknown ベースのポインター (COM ソース)。

  • マネージド オブジェクトのポインター (マネージド イベントの場合)。

&ReceiverClass::HandlerMethod
イベントにフックするイベント ハンドラー メソッドへのポインター。 ハンドラーは、クラスのメソッドか、または同じものへの参照として指定されます。 クラス名を指定しない場合、__hook は、クラスを、呼び出し元になっているものと見なします。

  • ネイティブ C++ イベント: ReceiverClass はイベント レシーバー クラスであり、HandlerMethod はハンドラーです。

  • COM イベント: ReceiverClass はイベント レシーバー インターフェイスであり、HandlerMethod はハンドラーの 1 つです。

  • マネージド イベント: ReceiverClass はイベント レシーバー クラスであり、HandlerMethod はハンドラーです。

receiver
(省略可能) イベント レシーバー クラスのインスタンスへのポインター。 レシーバーを指定しない場合、既定値は __hook が呼び出されるレシーバー クラスまたは構造体です。

使用法

イベント レシーバー クラス外の main を含む、任意の関数スコープで使用できます。

解説

ハンドラー メソッドをイベント メソッドに関連付けるかフックするには、イベント レシーバー内で組み込み関数 __hook を使用します。 ソースで指定されたイベントが発生すると、指定されたハンドラーが呼び出されます。 複数のイベント ハンドラーを 1 つのイベントに、または複数のイベントを 1 つのイベント ハンドラーにフックすることができます。

__hook には 2 つの形式があります。 ほとんどの場合、最初 (引数が 4 つ) の形式を使用できます。特に、event_receiver 属性の layout_dependent パラメーターが false である COM イベント レシーバーの場合が該当します。

このような場合、メソッドの 1 つでイベントを発生させる前に、インターフェイスのすべてのメソッドをフックする必要はありません。 イベントを処理するメソッドのみフックする必要があります。 __hook の 2 番目 (引数が 2 つ) の形式は、layout_dependent= true となる COM イベント レシーバーにのみ使用できます。

__hook は long 型の値を返します。 ゼロ以外の戻り値は、エラーが発生したことを示します (マネージド イベントは例外をスローします)。

コンパイラは、イベントが存在するかどうかをチェックし、イベント プロシージャがデリゲート シグネチャと一致することを確認します。

COM イベントの場合を除き、__hook__unhook は、イベント レシーバーの外部で呼び出すことができます。

__hook の使用の代替手段は、+= 演算子を使用することです。

新しい構文でのマネージド イベントのコーディングの詳細については、event に関する記事を参照してください。

Note

テンプレート クラスまたは構造体に events を含めることはできません。

サンプルについては、「ネイティブ C++ でのイベント処理」と「COM でのイベント処理」を参照してください。

関連項目

キーワード
イベント処理
event_source
event_receiver
__event
__unhook
__raise