共用方式為


__event

宣告事件。

__event method-declarator; 
__event __interface interface-specifier; 
__event member-declarator;

備註

關鍵字 __event 可以套用至方法宣告、介面宣告或資料成員宣告。 不過,您無法使用 __event 關鍵字限定巢狀類別的成員。

根據您的事件來源和接收器是原生 C++,COM 或 Managed (.NET Framework),您可以將下列建構當做事件使用:

原生 C++

COM

Managed (.NET Framework)

方法

方法

介面

資料成員

在事件接收器中使用 __hook 建立處理常式方法與事件方法的關聯。 請注意,在您使用 __event 關鍵字建立事件後,每當呼叫該事件時,會一併呼叫後續攔截到該事件的所有事件處理常式。

__event 方法宣告不能有定義;定義會隱含產生,因此可以將事件方法當做任何一般方法予以呼叫。

注意事項注意事項

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

原生事件

原生事件是方法。 傳回類型通常是 HRESULT 或 void,不過可以是任何整數類型,包括 enum。 當事件使用整數傳回類型時,會在事件處理常式傳回非零值時定義錯誤條件,在此情況下,所引發的事件會呼叫其他委派。

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

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

COM 事件

COM 事件是介面。 事件來源介面中的方法參數應該是 in 參數 (但不會強制執行),因為多點傳送時不適用 out 參數。 如果您使用 out 參數,會發出層級 1 警告。

傳回類型通常是 HRESULT 或 void,但可以是任何整數類型,包括 enum。 當事件使用整數傳回類型且事件處理常式傳回非零值時,會是錯誤條件,在此情況下,所引發的事件會中止呼叫其他委派。 請注意,編譯器會在所產生的 IDL 中自動將事件來源介面標記為來源

COM 事件來源的 __event 之後,一定要有 __interface 關鍵字。

// Example of a COM event:
__event __interface IEvent1;

如需範例程式碼,請參閱 COM 中的事件處理

Managed 事件

如需新語法中編碼事件的相關資訊,請參閱event (C++ 元件擴充功能)

Managed 事件是資料成員或方法。 搭配事件使用時,委派的傳回類型必須符合 Common Language Specification。 事件處理常式的傳回類型必須符合委派的傳回類型。 如需委派的詳細資訊,請參閱 __delegate。 如果 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;
   }
};

範例:Managed 事件

// EventHandling_Managed_Event.cpp
// compile with: /clr:oldSyntax /c
using namespace System;
[event_source(managed)]
public __gc class CPSource {

public:
   __event void MyEvent(Int16 nValue);
};

將屬性套用至事件時,您可以指定將該屬性套用至產生的方法或產生的委派的叫用方法。預設 (event:) 是將屬性套用至事件。

// EventHandling_Managed_Event_2.cpp
// compile with: /clr:oldSyntax /c
using namespace System;
[attribute(All, AllowMultiple=true)]
public __gc class Attr {};

public __delegate void D();

public __gc class X {
public:
   [method:Attr] __event D* E;
   [returnvalue:Attr] __event void noE();
};

請參閱

參考

C++ 關鍵字

事件處理

event_source

event_receiver

__hook

__unhook

__raise