__event キーワード

イベントを宣言します。

Note

ネイティブ C++ のイベント属性は、標準 C++ と互換性がありません。 この属性は、/permissive- 準拠モードを指定するとコンパイルされません。

構文

__event member-function-declarator ;
__event __interface interface-specifier ;
__event data-member-declarator ;

解説

Microsoft 固有のキーワード __event は、メンバー関数宣言、インタフェース宣言、データメンバー宣言のいずれかに適用できます。 ただし、__event キーワードを使用して、入れ子になったクラスのメンバーを修飾することはできません。

イベント ソースとイベント レシーバーがネイティブ C++、COM、またはマネージド (.NET Framework) であるかによって、次の構成体をイベントとして使用できます。

ネイティブ C++ COM (COM) マネージド (.NET Framework)
member 関数 - method
- interface -
- - データ メンバー (data member)

ハンドラー メンバー関数をイベント メンバー関数に関連付けるには、イベント レシーバーで __hook を使用します。 __event キーワードを使用してイベントを作成した後、そのイベントが呼び出されると、そのイベントにフックされているすべてのイベント ハンドラーが呼び出されます。

__event メンバー関数の宣言には定義を含めることができません。定義は暗黙的に生成されるため、通常のメンバー関数と同じように、イベントメンバー関数を呼び出すことができます。

Note

テンプレート クラスまたは構造体にイベントを含めることはできません。

ネイティブ イベント

ネイティブ イベントは、メンバー関数です。 戻り値の型は、通常、HRESULT または void ですが、enum などの任意の整数型でもかまいません。 イベントが整数の戻り値の型を使用する場合、イベント ハンドラーがゼロ以外の値を返すときのエラー条件が定義されます。 この場合、発生するイベントは他のデリゲートを呼び出します。

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

サンプル コードについては、「ネイティブ C++ でのイベント処理」を参照してください。

COM イベント

COM イベントはインターフェイスです。 イベント ソース インターフェイスのメンバー関数のパラメーターは、in パラメーターである必要がありますが、厳密には適用されません。 これは、マルチキャストを行うときに out パラメーターが役に立たないためです。 レベル 1 の警告は out パラメーターを使用した場合に発行されます。

戻り値の型は、通常、HRESULT または void ですが、enum などの任意の整数型でもかまいません。 イベントが整数の戻り値の型を使用し、イベント ハンドラーがゼロ以外の値を返す場合、そのエラー条件です。 発生するイベントによって、他のデリゲートへの呼び出しが中止されます。 コンパイラは、生成する IDL でイベント ソース インターフェイスを source として自動的にマークします。

__interface キーワードは、常に COM イベント ソースの __event の後に指定する必要があります。

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

サンプル コードについては、「COM でのイベント処理」を参照してください。

マネージド イベント

新しい構文でイベントをコーディングする方法については、「イベント」を参照してください。

マネージド イベントは、データ メンバーまたはメンバー関数です。 イベントで使用する場合、デリゲートの戻り値の型は共通言語仕様に準拠している必要があります。 イベント ハンドラーの戻り値の型は、デリゲートの戻り値の型と一致する必要があります。 デリゲートの詳細については、「デリゲートとイベント」を参照してください。 マネージド イベントがメンバー関数である場合、その型はデリゲートへのポインターでなければなりません。

.NET Framework では、それ自身がメソッド (つまり、対応するデリゲートの Invoke メソッド) であるかのようにデータ メンバーを処理できます。 これを行うには、マネージド イベント データ メンバーを宣言するためのデリゲート型を事前に定義します。 これに対し、マネージド イベント メソッドは、まだ定義されていない場合、対応するマネージド デリゲートを暗黙的に定義します。 たとえば、次のように、OnClick などのイベント値をイベントとして宣言できます。

// Examples of managed events:
__event ClickEventHandler* OnClick;  // data member as event
__event void OnClick(String* s);  // method as event

マネージド イベントを暗黙的に宣言するときは、イベント ハンドラーが 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