네이티브 C++에서 이벤트 처리
네이티브 C++ 이벤트 처리에서 event_source 및 event_receiver 특성을 사용하여 이벤트 소스와 이벤트 수신기를 각각 설정하고 type=native를 지정합니다. 이러한 특성을 사용하면 해당 특성이 적용되는 클래스가 COM 이외의 네이티브 컨텍스트에서 이벤트를 발생시키고 처리할 수 있습니다.
이벤트 선언
이벤트 소스 클래스에서 메서드 선언에 __event 키워드를 사용하여 메서드를 이벤트로 선언합니다. 메서드를 선언하되 정의하지는 마십시오. 메서드가 이벤트로 만들어질 때 컴파일러가 메서드를 암시적으로 정의하기 때문에 사용자가 메서드를 정의하면 컴파일러 오류가 생성됩니다. 네이티브 이벤트는 매개 변수가 0개 이상인 메서드일 수 있습니다. 반환 형식은 void 또는 모든 정수 계열 형식이 될 수 있습니다.
이벤트 처리기 정의
이벤트 수신기 클래스에서는 처리될 이벤트와 일치하는 시그니처(반환 형식, 호출 규칙 및 인수)가 포함된 메서드인 이벤트 처리기를 정의합니다.
이벤트에 이벤트 처리기 후크
또한 이벤트 수신기 클래스에서는 내장 함수 __hook를 사용하여 이벤트를 이벤트 처리기에 연결하고 __unhook를 사용하여 이벤트 처리기에서 이벤트를 분리합니다. 한 이벤트 처리기에 여러 이벤트를 후크하거나 한 이벤트에 여러 이벤트 처리기를 후크할 수 있습니다.
이벤트 발생
이벤트를 발생시키려면 이벤트 소스 클래스에서 이벤트로 선언된 메서드를 호출하기만 하면 됩니다. 처리기가 이벤트에 후크된 경우 처리기가 호출됩니다.
네이티브 C++ 이벤트 코드
다음 예제에서는 네이티브 C++에서 이벤트를 발생시키는 방법을 보여 줍니다. 예제를 컴파일 및 실행하려면 코드의 주석을 참조하십시오.
예제
코드
// evh_native.cpp
#include <stdio.h>
[event_source(native)]
class CSource {
public:
__event void MyEvent(int nValue);
};
[event_receiver(native)]
class CReceiver {
public:
void MyHandler1(int nValue) {
printf_s("MyHandler1 was called with value %d.\n", nValue);
}
void MyHandler2(int nValue) {
printf_s("MyHandler2 was called with value %d.\n", nValue);
}
void hookEvent(CSource* pSource) {
__hook(&CSource::MyEvent, pSource, &CReceiver::MyHandler1);
__hook(&CSource::MyEvent, pSource, &CReceiver::MyHandler2);
}
void unhookEvent(CSource* pSource) {
__unhook(&CSource::MyEvent, pSource, &CReceiver::MyHandler1);
__unhook(&CSource::MyEvent, pSource, &CReceiver::MyHandler2);
}
};
int main() {
CSource source;
CReceiver receiver;
receiver.hookEvent(&source);
__raise source.MyEvent(123);
receiver.unhookEvent(&source);
}
Output
MyHandler2 was called with value 123.
MyHandler1 was called with value 123.