이벤트 처리 원리
모든 이벤트 처리에 공통적인 세 가지 단계가 있습니다. 다음을 수행해야 합니다.
개체에 이벤트 인터페이스를 구현합니다.
개체가 이벤트를 수신하도록 이벤트 원본에 알려 줍니다.
개체가 더 이상 이벤트를 수신할 필요가 없는 경우 이벤트 원본을 프로비전 해제합니다.
이벤트 인터페이스를 구현하는 방법은 해당 형식에 따라 달라집니다. 이벤트 인터페이스는 vtable, 이중 또는 dispinterface일 수 있습니다. 인터페이스를 정의하는 것은 이벤트 원본의 디자이너에 달려 있습니다. 해당 인터페이스를 구현하는 것은 사용자의 달려 있습니다.
참고 항목
이벤트 인터페이스가 이중일 수 없는 기술적 이유는 없지만 이중 인터페이스를 사용하지 않는 데는 여러 가지 좋은 디자인 이유가 있습니다. 그러나 이는 이벤트 원본의 디자이너/구현자가 결정한 것입니다. 이벤트의 관점에서 작업하기 때문에 이중 이벤트 sink
인터페이스를 구현하는 것 외에도 선택할 수 있는 가능성을 허용해야 합니다. 이중 인터페이스에 대한 자세한 내용은 이중 인터페이스 및 ATL을 참조하세요.
이벤트 원본에 대한 조언은 다음 세 단계로 나눌 수 있습니다.
IConnectionPointContainer에 대한 원본 개체를 쿼리합니다.
관심 있는 이벤트 인터페이스의 IID를 전달하는 IConnectionPointContainer::FindConnectionPoint를 호출합니다. 성공하면 연결 지점 개체에서 IConnectionPoint 인터페이스를 반환합니다.
IConnectionPoint::이벤트 싱크를 전달하는 것이
IUnknown
좋습니다. 성공하면 연결을 나타내는 쿠키를DWORD
반환합니다.
이벤트 수신에 대한 관심을 성공적으로 등록하면 원본 개체에서 발생한 이벤트에 따라 개체의 이벤트 인터페이스에 대한 메서드가 호출됩니다. 더 이상 이벤트를 수신할 필요가 없는 경우 IConnectionPoint::Unadvise를 통해 쿠키를 연결 지점으로 다시 전달할 수 있습니다. 이렇게 하면 원본과 싱크 간의 연결이 끊어지게 됩니다.
이벤트를 처리할 때 참조 주기를 방지합니다.