__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
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示