ネイティブ 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.