연결점
(자동화 이전의 OLE 연결 지점으로) 연결 지점을 구현 하는 방법을 설명 하는 MFC 클래스를 사용 하 여 CCmdTarget 및 CConnectionPoint.
과거에는 구성 요소 개체 모델 (COM) 일반 메커니즘을 정의 (IUnknown::QueryInterface)는 구현 하 고 인터페이스에서 기능을 노출 하는 개체를 허용 합니다.그러나 특정 인터페이스를 호출 하는 기능을 노출 하는 개체를 사용할 수 있는 해당 메커니즘 정의 되지 않았습니다.즉, COM 개체를 수신 하는 방법에 대 한 포인터를 정의 (해당 개체의 인터페이스에 대 한 포인터)를 처리 하는 있지만 나가는 인터페이스 (개체가 다른 개체의 인터페이스를 보유 하는 포인터)에 대 한 명시적인 모델이 없었습니다.COM 이제이 기능을 지 원하는 연결 지점 이라는 모델을 사용 합니다.
연결을 두 부분으로 이루어져 있습니다: 원본 및 인터페이스를 구현 하는 개체를 호출 하는 인터페이스를 호출 하는 개체는 싱크 라는.연결 지점 원본에 의해 노출 되는 인터페이스입니다.연결 지점을 제공 하 여 소스 싱크를 자체 (원본)에 대 한 연결을 설정할 수 있습니다.메커니즘을 통해 연결 지점 (의 IConnectionPoint 인터페이스), 싱크 인터페이스 포인터는 소스 개체에 전달 됩니다.This이 포인터는 소스와 싱크 구현 멤버 함수는 집합의 액세스를 제공합니다.예를 들어, 싱크에 의해 구현 된 이벤트를 발생 시키려면 소스 싱크 구현에서는 적절 한 메서드를 호출할 수 있습니다.다음 그림은 연결을 보여 줍니다. 방금 설명한 지점.
구현된 연결 지점
MFC는이 모델의 구현에 CConnectionPoint 및 CCmdTarget 클래스.파생 클래스에서 CConnectionPoint 구현에서 IConnectionPoint 인터페이스를 다른 개체에 연결 지점을 파악 하는 데 사용 합니다.파생 클래스에서 CCmdTarget 구현에서 IConnectionPointContainer 인터페이스를 모든 개체의 사용 가능한 연결 지점 열거 또는 특정 연결 지점을 찾을 수 있습니다.
클래스에서 구현 된 각 연결 지점에 대 한 연결 지점을 구현 하는 연결 부분을 선언 해야 합니다.하나 이상의 연결 지점을 구현 하는 경우 클래스에 단일 연결 맵도 선언 해야 합니다.연결 맵에 테이블 ActiveX 컨트롤에서 지 원하는 연결 지점입니다.
다음 예제는 단순한 연결 맵과 한 개의 연결 지점을 보여 줍니다.첫 번째 예제는 연결 맵과 연결 지점을 선언합니다. 두 번째 예제는 맵과 연결 지점을 구현합니다.참고 CMyClass 여야 합니다는 CCmdTarget-클래스를 파생 합니다.첫 번째 예제에서는 코드 클래스 선언에서 아래 삽입 되는 보호 된 섹션:
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()
클래스 추가 삽입을 가리킨 연결이 둘 이상 있는 경우 CONNECTION_PART 매크로 사이 BEGIN_CONNECTION_MAP 및 END_CONNECTION_MAP 매크로.
마지막으로 호출을 추가 EnableConnections 클래스의 생성자입니다.예를 들면 다음과 같습니다.
CMyClass::CMyClass()
{
EnableConnections();
}
이 코드를 삽입 한 후에 CCmdTarget-파생된 클래스에 대 한 연결 지점을 노출의 ISampleSink 인터페이스.다음 그림은이 예제를 보여 줍니다.
MFC로 구현 된 연결 지점
일반적으로 "멀티 캐스팅" 연결점을 지원-여러 싱크에 브로드캐스트하는 기능이 동일한 인터페이스에 연결 합니다.다음 예제 코드를 보여 줍니다. 각 연결점에 싱크를 반복 하 여 멀티 캐스트 방법:
void CMyClass::CallSinkFunc()
{
POSITION pos = m_xSampleConnPt.GetStartPosition();
ISampleSink* pSampleSink;
while( pos != NULL )
{
pSampleSink = (ISampleSink*)(m_xSampleConnPt.GetNextConnection(pos));
if(pSampleSink != NULL)
pSampleSink->SinkFunc();
}
}
연결의 현재 집합을 검색 하는이 예제는 SampleConnPt 호출로 연결 지점 CConnectionPoint::GetConnections.연결 및 호출을 다음 반복 ISampleSink::SinkFunc 의 모든 활성 연결이 있습니다.