在原生C++事件處理中,您會分別使用event_source和event_receiver屬性來設定事件來源和事件接收器,並指定 。type=native 這些屬性可讓它們套用的類別引發事件,並在原生的非 COM內容中處理事件。
注意
原生 C++ 中的事件屬性與標準 C++ 不相容。 當您指定 /permissive- 一致性模式時,它們不會編譯。
宣告事件
在事件來源類別中,在 __event 方法宣告上使用 關鍵詞,將方法宣告為事件。 請務必宣告 方法,但不要加以定義。 如果您這樣做,它會產生編譯程式錯誤,因為編譯程式會在將 方法隱含地定義為事件時。 原生事件可以是包含零個或多個參數的方法。 傳回型別可以是 void 或任何整數型別。
定義事件處理程式
在事件接收器類別中,您可以定義事件處理程式。 事件處理程式是具有簽章的方法(傳回型別、呼叫慣例和自變數),符合它們將處理的事件。
將事件處理程式連結至事件
此外,在事件接收器類別中,您也可以使用內部函數 __hook 將事件與事件處理程式產生關聯,以及 __unhook 將事件與事件處理程式解除關聯。 您可以在事件處理常式中攔截多個事件,或在事件中攔截多個事件處理常式。
引發事件
若要引發事件,請在事件來源類別中呼叫宣告為事件的方法。 如果在事件中攔截到處理常式,則會呼叫處理常式。
原生C++事件程序代碼
下列範例示範如何在原生 C++ 中引發事件。 若要編譯和執行這個範例,請參閱程式碼中的註解。 若要在 Visual Studio IDE 中建置程式代碼,請確認 /permissive- 選項已關閉。
範例
Code
// 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.