__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
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示