共用方式為


__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 函式 - 方法
- 介面 -
- - 數據成員

__hook 事件接收器中使用 ,將處理程式成員函式與事件成員函式產生關聯。 使用 __event 關鍵詞建立事件之後,所有連結至該事件的事件處理程式都會在呼叫事件時呼叫。

__event成員函式宣告不能有定義;定義是隱含產生的,因此可以呼叫事件成員函式,就像是任何一般成員函式一樣。

備註

樣板化類別或結構不能包含事件。

原生事件

原生事件是成員函式。 傳回型別通常是 HRESULTvoid,但可以是任何整數型別,包括 enum。 當事件使用整數傳回型別時,當事件處理程式傳回非零值時,就會定義錯誤條件。 在此情況下,引發的事件會呼叫其他委派。

// Examples of native C++ events:
__event void OnDblClick();
__event HRESULT OnClick(int* b, char* s);

如需範例程式代碼,請參閱 原生C++中的事件處理

COM 事件

COM 事件是介面。 事件來源介面中成員函式的參數應 位於參數中 ,但不會嚴格強制執行。 這是因為多播時 out 參數並無用處。 如果您使用 out 參數,則會發出層級 1 警告。

傳回型別通常是 HRESULTvoid,但可以是任何整數型別,包括 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 事件時,您可以指定 addremove 存取子,以在新增或移除事件處理程式時呼叫。 您也可以定義成員函式,從類別外部呼叫 (引發) 事件。

範例:原生事件

// 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