__eventключевое слово

Объявление события.

Примечание.

Атрибуты событий в собственном языке C++ несовместимы со стандартом C++. Они не компилируются при указании /permissive- режима соответствия.

Синтаксис

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

Замечания

К объявлению функции-члену, объявлению интерфейса или объявлению члена можно применять ключевое слово конкретной __event корпорации Майкрософт. Однако вы не можете использовать __event ключевое слово для квалификации члена вложенного класса.

В зависимости от того, являются ли источник и получатель события неуправляемыми объектами C++, объектами COM или управляемыми объектами (в .NET Framework), в качестве событий можно использовать следующие конструкции:

Машинный C++ COM Управляемый (.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 являются интерфейсами. Параметры функции-члена в исходном интерфейсе события должны находиться в параметрах, но они не применяются строго. Это связано с тем, что параметр out не полезен при многоадресной рассылке. Если вы используете параметр out , выдается предупреждение уровня 1.

Возвращаемый тип обычно HRESULT или voidможет быть любым целочисленным типом, включая enum. Если событие использует целочисленный тип возвращаемого значения и обработчик событий возвращает ненулевое значение, это условие ошибки. Событие вызывает прерывание вызовов другим делегатам. Компилятор автоматически помечает исходный интерфейс события как source созданный IDL.

Ключевое слово __interface всегда требуется для __event источника событий COM.

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