宣告事件。
備註
原生C++中的事件屬性與標準C++不相容。 當您指定 /permissive- 一致性模式時,它們不會編譯。
語法
__eventmember-function-declarator;
__event__interfaceinterface-specifier;
__eventdata-member-declarator;
備註
Microsoft特定關鍵詞 __event 可以套用至成員函式宣告、介面宣告或數據成員宣告。 不過,您無法使用 __event 關鍵詞來限定巢狀類別的成員。
根據您的事件來源和接收者是否為原生C++、COM 或Managed (.NET Framework),您可以使用下列建構作為事件:
| 原生C++ | COM | Managed (.NET Framework) |
|---|---|---|
| member 函式 | - | 方法 |
| - | 介面 | - |
| - | - | 數據成員 |
在 __hook 事件接收器中使用 ,將處理程式成員函式與事件成員函式產生關聯。 使用 __event 關鍵詞建立事件之後,所有連結至該事件的事件處理程式都會在呼叫事件時呼叫。
__event成員函式宣告不能有定義;定義是隱含產生的,因此可以呼叫事件成員函式,就像是任何一般成員函式一樣。
備註
樣板化類別或結構不能包含事件。
原生事件
原生事件是成員函式。 傳回型別通常是 HRESULT 或 void,但可以是任何整數型別,包括 enum。 當事件使用整數傳回型別時,當事件處理程式傳回非零值時,就會定義錯誤條件。 在此情況下,引發的事件會呼叫其他委派。
// Examples of native C++ events:
__event void OnDblClick();
__event HRESULT OnClick(int* b, char* s);
如需範例程式代碼,請參閱 原生C++中的事件處理 。
COM 事件
COM 事件是介面。 事件來源介面中成員函式的參數應 位於參數中 ,但不會嚴格強制執行。 這是因為多播時 out 參數並無用處。 如果您使用 out 參數,則會發出層級 1 警告。
傳回型別通常是 HRESULT 或 void,但可以是任何整數型別,包括 enum。 當事件使用整數傳回型別,而事件處理程式傳回非零值時,即為錯誤條件。 引發的事件會中止對其他委派的呼叫。 編譯程式會自動在產生的 IDL 中將事件來源介面標示為 source 。
__interface COM 事件來源一律需要 關鍵詞__event。
// Example of a COM event:
__event __interface IEvent1;
如需範例程式代碼 ,請參閱 COM 中的事件處理 。
Managed 事件
如需以新語法撰寫事件的相關信息,請參閱 event。
Managed 事件是數據成員或成員函式。 搭配事件使用時,委派的傳回型別必須符合 Common Language Specification。 事件處理程式的傳回型別必須符合委派的傳回型別。 如需委派的詳細資訊,請參閱 委派和事件。 如果 Managed 事件是數據成員,其類型必須是委派的指標。
在 .NET Framework 中,您可以將數據成員視為方法本身(也就是 Invoke 其對應委派的 方法)。 若要這樣做,請預先定義委派類型,以宣告 Managed 事件數據成員。 相反地,如果尚未定義 Managed 事件方法,則會隱含定義對應的 Managed 委派。 例如,您可以宣告事件值,例如 OnClick 事件,如下所示:
// Examples of managed events:
__event ClickEventHandler* OnClick; // data member as event
__event void OnClick(String* s); // method as event
隱含宣告 Managed 事件時,您可以指定 add 和 remove 存取子,以在新增或移除事件處理程式時呼叫。 您也可以定義成員函式,從類別外部呼叫 (引發) 事件。
範例:原生事件
// EventHandling_Native_Event.cpp
// compile with: /c
[event_source(native)]
class CSource {
public:
__event void MyEvent(int nValue);
};
範例:COM 事件
// EventHandling_COM_Event.cpp
// compile with: /c
#define _ATL_ATTRIBUTES 1
#include <atlbase.h>
#include <atlcom.h>
[ module(dll, name="EventSource", uuid="6E46B59E-89C3-4c15-A6D8-B8A1CEC98830") ];
[ dual, uuid("00000000-0000-0000-0000-000000000002") ]
__interface IEventSource {
[id(1)] HRESULT MyEvent();
};
[ coclass, uuid("00000000-0000-0000-0000-000000000003"), event_source(com) ]
class CSource : public IEventSource {
public:
__event __interface IEventSource;
HRESULT FireEvent() {
__raise MyEvent();
return S_OK;
}
};
另請參閱
關鍵字
事件處理
event_source
event_receiver
__hook
__unhook
__raise