다음을 통해 공유


연결 지점

이 문서에서는 MFC 클래스를 사용하여 연결점(이전의 OLE 연결점)을 구현하는 CConnectionPoint방법을 설명합니다CCmdTarget.

과거에 COM(구성 요소 개체 모델)은 개체가 인터페이스에서 기능을 구현하고 노출하도록 허용하는 일반 메커니즘(IUnknown::QueryInterface*)을 정의했습니다. 그러나 개체가 특정 인터페이스를 호출하는 기능을 노출하도록 허용하는 해당 메커니즘은 정의되지 않았습니다. 즉, COM은 개체에 대한 들어오는 포인터(해당 개체의 인터페이스에 대한 포인터)를 처리하는 방법을 정의했지만 나가는 인터페이스에 대한 명시적 모델(개체가 다른 개체의 인터페이스에 보유하는 포인터)이 없습니다. COM에는 이제 이 기능을 지원하는 연결점이라는 모델이 있습니다.

연결에는 소스라고 하는 인터페이스를 호출하는 개체와 싱크라는 인터페이스를 구현하는 개체의 두 부분이 있습니다. 연결점은 원본에서 노출하는 인터페이스입니다. 연결점을 노출하면 원본을 통해 싱크가 자체(원본)에 대한 연결을 설정할 수 있습니다. 연결점 메커니즘(인터페이스)을 IConnectionPoint 통해 싱크 인터페이스에 대한 포인터가 원본 개체에 전달됩니다. 이 포인터는 멤버 함수 집합의 싱크 구현에 대한 액세스 권한을 소스에 제공합니다. 예를 들어 싱크에서 구현된 이벤트를 발생하려면 원본에서 싱크 구현의 적절한 메서드를 호출할 수 있습니다. 다음 그림에서는 방금 설명한 연결점을 보여 줍니다.

Diagram showing an implemented connection point.
구현된 연결 지점

MFC는 C커넥트ionPointCCmdTarget 클래스에서 이 모델을 구현합니다. 인터페이스 구현 IConnectionPoint 에서 CConnectionPoint 파생된 클래스로, 연결점을 다른 개체에 노출하는 데 사용됩니다. 개체의 사용 가능한 모든 연결점을 열거하거나 특정 연결점을 찾을 수 있는 인터페이스 구현 IConnectionPointContainer 에서 CCmdTarget 파생된 클래스입니다.

클래스에 구현된 각 연결 지점에 대해 연결 지점을 구현하는 연결 부분을 선언해야 합니다. 하나 이상의 연결 지점을 구현하는 경우 클래스에서 단일 연결 맵도 선언해야 합니다. 연결 맵은 ActiveX 컨트롤에서 지원하는 연결 지점의 테이블입니다.

다음 예제에서는 간단한 연결 맵과 하나의 연결 지점을 보여 줍니다. 첫 번째 예제에서는 연결 맵 및 점을 선언합니다. 두 번째 예제에서는 지도와 점을 구현합니다. CMyClass 파생 클래스여야 CCmdTarget합니다. 첫 번째 예제에서 코드는 클래스 선언의 섹션 아래에 삽입됩니다 protected .

class CMyClass : public CCmdTarget
{
protected:
   // Connection point for ISample interface
   BEGIN_CONNECTION_PART(CMyClass, SampleConnPt)
      CONNECTION_IID(IID_ISampleSink)
   END_CONNECTION_PART(SampleConnPt)

   DECLARE_CONNECTION_MAP()

BEGIN_CONNECTION_PART 및 END_CONNECTION_PART 매크로는 이 특정 연결점을 구현하는 포함된 클래스 XSampleConnPt (파생CConnectionPoint)를 선언합니다. 멤버 함수를 재정 CConnectionPoint 의하거나 고유한 멤버 함수를 추가하려면 이 두 매크로 간에 선언합니다. 예를 들어 매크로는 CONNECTION_IID 이러한 두 매크로 사이에 배치할 때 멤버 함수를 재정 CConnectionPoint::GetIID 의합니다.

두 번째 예제에서는 코드가 컨트롤의 구현 파일(.cpp 파일)에 삽입됩니다. 이 코드는 연결 지점을 SampleConnPt포함하는 연결 맵을 구현합니다.

BEGIN_CONNECTION_MAP(CMyClass, CCmdTarget)
    CONNECTION_PART(CMyClass, IID_ISampleSink, SampleConnPt)
END_CONNECTION_MAP()

클래스에 둘 이상의 연결점이 있는 경우 BEGIN_CONNECTION_MAP END_CONNECTION_MAP 매크로 사이에 추가 CONNECTION_PART매크로를 삽입합니다.

마지막으로 클래스의 생성자에 호출 EnableConnections 을 추가합니다. 예시:

CMyClass::CMyClass()
{
   EnableConnections();
}

이 코드가 삽입되면 CCmdTarget파생 클래스는 인터페이스에 대한 ISampleSink 연결점을 노출합니다. 다음 그림은 이러한 예제를 보여 줍니다.

Diagram showing a Connection point implemented by using MFC.
MFC를 사용하여 구현된 커넥트ion 지점

일반적으로 연결점은 동일한 인터페이스에 연결된 여러 싱크로 브로드캐스트하는 기능인 "멀티캐스팅"을 지원합니다. 다음 예제 조각에서는 연결점의 각 싱크를 반복하여 멀티캐스트하는 방법을 보여 줍니다.

void CMyClass::CallSinkFunc()
{
   POSITION pos = m_xSampleConnPt.GetStartPosition();
   ISampleSink* pSampleSink;
   while (pos != NULL)
   {
      pSampleSink = (ISampleSink*)(m_xSampleConnPt.GetNextConnection(pos));
      if (pSampleSink != NULL)
         pSampleSink->SinkFunc();
   }
}

이 예제에서는 호출을 사용하여 연결 지점에서 현재 연결 집합을 검색합니다 SampleConnPtCConnectionPoint::GetConnections. 그런 다음, 연결을 반복하고 모든 활성 연결을 호출 ISampleSink::SinkFunc 합니다.

참고 항목

MFC COM