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

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

Note

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

イベントの宣言

イベント ソース クラスでは、メソッド宣言で __event キーワードを使用して、イベントとしてメソッドを宣言します。 メソッドを必ず宣言してください。ただし、定義はしないでください。 定義すると、コンパイラ エラーが生成されます。これは、コンパイラはイベントに変更されると、メソッドを暗黙的に定義するためです。 ネイティブ イベントは、ゼロ以上のパラメーターを持つメソッドにできます。 戻り値の型は void または任意の整数型です。

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

イベント レシーバー クラスは、イベント ハンドラーを定義します。 イベント ハンドラーは、処理するイベントに一致するシグネチャ (戻り値の型、呼び出し規則、引数) を持つメソッドです。

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

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

イベントの発生

イベントを発生させるには、イベント ソース クラスのイベントとして宣言されたメソッドを呼び出します。 ハンドラーがイベントにフックされている場合は、ハンドラーが呼び出されます。

ネイティブ C++ イベント コード

次の例は、ネイティブ C++ でイベントを発生させる方法を示しています。 例をコンパイルして実行するには、コード内のコメントを参照してください。 Visual Studio IDE でコードをビルドするには、/permissive- オプションがオフになっていることを確認します。

コード

// evh_native.cpp
// compile by using: cl /EHsc /W3 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);
}

出力

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

関連項目

イベント処理