__event
關鍵 字
宣告事件。
注意
原生 C++ 中的事件屬性與標準 C++ 不相容。 當您指定 /permissive-
一致性模式時,它們不會編譯。
語法
__event
member-function-declarator
;
__event
__interface
interface-specifier
;
__event
data-member-declarator
;
備註
Microsoft 特定的關鍵字 __event
可以套用至成員函式宣告、介面宣告或資料成員宣告。 不過,您無法使用 __event
關鍵字來限定巢狀類別的成員。
根據您的事件來源和接收器是原生 C++,COM 或 Managed (.NET Framework),您可以將下列建構當做事件使用:
原生 C++ | COM | Managed (.NET Framework) |
---|---|---|
member 函式 | - | method |
- | interface | - |
- | - | 資料成員 |
在 __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
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應