__hook
ハンドラー メソッドをイベントに関連付けます。
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 ポインター (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 (C++ コンポーネント拡張)」を参照してください。
注意
テンプレート クラスまたは構造体にイベントを含めることはできません。
使用例
使用例については、「ネイティブ C++ でのイベント処理」および「COM でのイベント処理」を参照してください。