次の方法で共有


ネイティブ C++ のイベント処理

ネイティブ C++ のイベント処理ではソースevent_receiver の属性を使用して type=native を指定するイベント ソースとイベント レシーバーがそれぞれ設定します。これらの属性はネイティブのイベントと操作イベントを発生させるために適用されるクラスCOM コンテキストができます。

イベントの宣言

イベント ソース クラスではイベントとしてメソッドを宣言するにはメソッド宣言の __event のキーワードを使用します。メソッドを宣言することを確認しますがは定義しないでください ; これによりイベントに設定する場合コンパイラはメソッドを暗黙的に定義するためコンパイラ エラーが発生します。ネイティブ イベントにはこともより多くのパラメーターのメソッドです。戻り値の型が void または整数型を指定できます。

イベント ハンドラーの定義

イベント レシーバー クラスでは定義 (戻り値の型呼び出し規約および) とメソッドの引数に一致するイベントのイベント ハンドラーを定義します。

イベントのイベント ハンドラーをフック

またイベント レシーバーのクラスではイベントのイベント ハンドラーを分離するイベント ハンドラーと __unhook とイベントを関連付けるには __hook 組み込み関数を使用します。イベントに複数のイベント ハンドラーに複数のイベントをフックすることができます。

イベントの発生

イベントを発生させるにはメソッドをイベント ソース クラスのイベントとして宣言しない単純に呼び出します。ハンドラーがイベントに引っ掛かったらハンドラーが呼び出されます。

ee2k0a7d.collapse_all(ja-jp,VS.110).gifネイティブ C++ コードのイベント

次の例はネイティブ C++ のイベントを発生させる方法を示します。例をコンパイルして実行するにはコード内のコメントを参照してください。

ee2k0a7d.collapse_all(ja-jp,VS.110).gifコード

// evh_native.cpp
#include <stdio.h>

[event_source(native)]
class CSource {
public:
   __event void MyEvent(int nValue);
};

[event_receiver(native)]
class CReceiver {
public:
   void MyHandler1(int nValue) {
      printf_s("MyHandler1 was called with value %d.\n", nValue);
   }

   void MyHandler2(int nValue) {
      printf_s("MyHandler2 was called with value %d.\n", nValue);
   }

   void hookEvent(CSource* pSource) {
      __hook(&CSource::MyEvent, pSource, &CReceiver::MyHandler1);
      __hook(&CSource::MyEvent, pSource, &CReceiver::MyHandler2);
   }

   void unhookEvent(CSource* pSource) {
      __unhook(&CSource::MyEvent, pSource, &CReceiver::MyHandler1);
      __unhook(&CSource::MyEvent, pSource, &CReceiver::MyHandler2);
   }
};

int main() {
   CSource source;
   CReceiver receiver;

   receiver.hookEvent(&source);
   __raise source.MyEvent(123);
   receiver.unhookEvent(&source);
}

ee2k0a7d.collapse_all(ja-jp,VS.110).gif出力

MyHandler2 was called with value 123.
MyHandler1 was called with value 123.

参照

関連項目

イベント処理