__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成員函式宣告不能有定義;定義是隱含產生的,因此可以呼叫事件成員函式,就像是任何一般成員函式一樣。

注意

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

原生事件

原生事件是成員函式。 傳回型別通常是 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

__interfaceCOM 事件來源一律需要 關鍵字 __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