다음을 통해 공유


IDispEventImpl 지원

템플릿 클래스 IDispEventImpl 을 사용하여 ATL 클래스의 연결 지점 싱크에 대한 지원을 제공할 수 있습니다. 연결점 싱크를 사용하면 클래스가 외부 COM 개체에서 발생한 이벤트를 처리할 수 있습니다. 이러한 연결점 싱크는 클래스에서 제공하는 이벤트 싱크 맵과 매핑됩니다.

클래스에 대한 연결점 싱크를 올바르게 구현하려면 다음 단계를 완료해야 합니다.

  • 각 외부 개체에 대한 형식 라이브러리 가져오기

  • IDispEventImpl 인터페이스 선언

  • 이벤트 싱크 맵 선언

  • 연결점 조언 및 비지정

연결점 싱크 구현과 관련된 단계는 모두 클래스의 헤더 파일(.h)만 수정하여 수행됩니다.

형식 라이브러리 가져오기

이벤트를 처리하려는 각 외부 개체에 대해 형식 라이브러리를 가져와야 합니다. 이 단계에서는 처리할 수 있는 이벤트를 정의하고 이벤트 싱크 맵을 선언할 때 사용되는 정보를 제공합니다. #import 지시문을 사용하여 이 작업을 수행할 수 있습니다. 지원되는 각 디스패치 인터페이스에 필요한 #import 지시문 줄을 클래스의 헤더 파일(.h)에 추가합니다.

다음 예제에서는 외부 COM 서버의 형식 라이브러리를 가져옵니다(MSCAL.Calendar.7).

#import "PROGID:MSCAL.Calendar.7" no_namespace, raw_interfaces_only

참고 항목

지원할 각 외부 형식 라이브러리에 대해 별도의 #import 문이 있어야 합니다.

IDispEventImpl 인터페이스 선언

이제 각 디스패치 인터페이스의 형식 라이브러리를 가져왔으므로 각 외부 디스패치 인터페이스에 대해 별도의 IDispEventImpl 인터페이스를 선언해야 합니다. 각 외부 개체에 대한 인터페이스 선언을 추가하여 클래스 선언을 IDispEventImpl 수정합니다. 매개 변수에 대한 자세한 내용은 IDispEventImpl을 참조하세요.

다음 코드는 클래스CMyCompositCtrl2에 의해 구현된 COM 개체에 DCalendarEvents 대해 인터페이스에 대해 두 개의 연결점 싱크를 선언합니다.

public IDispEventImpl<IDC_CALENDAR1, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>,
public IDispEventImpl<IDC_CALENDAR2, CMyCompositCtrl2, &__uuidof(DCalendarEvents), &__uuidof(__MSACAL), 7, 0>

이벤트 싱크 맵 선언

적절한 함수에서 이벤트 알림을 처리하려면 클래스가 각 이벤트를 올바른 처리기로 라우팅해야 합니다. 이는 이벤트 싱크 맵을 선언하여 수행됩니다.

ATL은 이 매핑을 더 쉽게 만드는 BEGIN_SINK_MAP, END_SINK_MAPSINK_ENTRY_EX 여러 매크로를 제공합니다. 표준 형식은 다음과 같습니다.

BEGIN_SINK_MAP(comClass)
  SINK_ENTRY_EX(id, iid, dispid, func)
  . . . //additional external event entries
END_SINK_MAP()

다음 예제에서는 두 개의 이벤트 처리기를 사용하여 이벤트 싱크 맵을 선언합니다.

BEGIN_SINK_MAP(CMyCompositCtrl2)
   //Make sure the Event Handlers have __stdcall calling convention
   SINK_ENTRY_EX(IDC_CALENDAR1, __uuidof(DCalendarEvents), DISPID_CLICK, 
      &CMyCompositCtrl2::ClickCalendar1)
   SINK_ENTRY_EX(IDC_CALENDAR2, __uuidof(DCalendarEvents), DISPID_CLICK, 
      &CMyCompositCtrl2::ClickCalendar2)
END_SINK_MAP()

구현이 거의 완료되었습니다. 마지막 단계는 외부 인터페이스의 권장 및 비지정과 관련이 있습니다.

IDispEventImpl 인터페이스에 대한 조언 및 프로비전 취소

마지막 단계는 적절한 시간에 모든 연결 지점을 조언(또는 취소)하는 메서드를 구현하는 것입니다. 외부 클라이언트와 개체 간의 통신이 이루어지기 전에 이 권장 사항을 수행해야 합니다. 개체가 표시되기 전에 개체에서 지원하는 각 외부 디스패치 인터페이스가 나가는 인터페이스에 대해 쿼리됩니다. 연결이 설정되고 나가는 인터페이스에 대한 참조를 사용하여 개체의 이벤트를 처리합니다. 이 절차를 "권고"라고 합니다.

개체가 외부 인터페이스로 완료되면 나가는 인터페이스가 더 이상 클래스에서 사용되지 않는다는 알림을 받아야 합니다. 이 프로세스를 "unadvising"이라고 합니다.

COM 개체의 고유한 특성으로 인해 이 프로시저는 구현 간에 세부 사항 및 실행에 따라 다릅니다. 이러한 세부 정보는 이 항목의 범위를 벗어나며 해결되지 않습니다.

참고 항목

ATL COM 개체 기본 사항