__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
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по