연결 가능한 개체의 아키텍처
연결 가능한 개체는 연결 가능한 개체의 전체 아키텍처 중 하나일 뿐입니다. 이 기술에는 다음 요소가 포함됩니다.
- 연결할 수 있는 개체입니다. IConnectionPointContainer 인터페이스를 구현합니다. 는 하나 이상의 연결점 개체를 만듭니다. 는 클라이언트에 대한 나가는 인터페이스를 정의합니다.
- 클라이언트. IConnectionPointContainer에 대한 개체를 쿼리하여 개체를 연결할 수 있는지 여부를 확인합니다. 는 싱크 개체를 만들어 연결 가능한 개체로 정의된 나가는 인터페이스를 구현합니다.
- 싱크 개체입니다. 나가는 인터페이스를 구현합니다. 연결 가능한 개체에 대한 연결을 설정하는 데 사용됩니다.
- 연결점 개체입니다. IConnectionPoint 인터페이스를 구현하고 클라이언트의 싱크와의 연결을 관리합니다.
클라이언트, 연결 가능한 개체, 연결 지점 및 싱크 간의 관계는 다음 다이어그램에 나와 있습니다.
연결점 개체가 이전 다이어그램의 3단계에서 싱크 인터페이스에서 메서드를 호출하기 전에 2단계에서 Advise 메서드를 호출할 때 포인터가 이미 전달된 경우에도 필요한 특정 인터페이스에 대해 QueryInterface를 호출해야 합니다.
이 아키텍처에는 두 개의 열거자 개체가 포함되지만 그림에는 표시되지 않습니다. 연결 가능한 개체 내의 연결점을 열거하기 위해 IConnectionPointContainer 의 메서드에 의해 생성됩니다. 다른 하나는 IConnectionPoint 의 메서드에 의해 만들어지고 현재 해당 연결 지점에 설정된 연결을 열거합니다. 하나의 연결점은 여러 개의 연결된 싱크 인터페이스를 지원할 수 있으며, 해당 인터페이스에서 메서드를 호출할 때마다 연결 목록을 반복해야 합니다. 이 프로세스를 멀티캐스팅이라고 합니다.
연결 가능한 개체로 작업할 때는 연결 가능한 개체, 각 연결 지점, 각 싱크 및 모든 열거자가 별도의 IUnknown 구현, 별도의 참조 수 및 별도의 수명을 가진 별도의 개체임을 이해하는 것이 중요합니다. 이러한 개체를 사용하는 클라이언트는 항상 소유하고 있는 모든 참조 수를 해제해야 합니다.
참고
연결할 수 있는 개체는 둘 이상의 클라이언트를 지원할 수 있으며 클라이언트 내에서 여러 싱크를 지원할 수 있습니다. 마찬가지로 싱크를 둘 이상의 연결 가능한 개체에 연결할 수 있습니다.
클라이언트와 연결 가능한 개체 간의 연결을 설정하는 단계는 다음과 같습니다.
- 클라이언트는 개체에서 IConnectionPointContainer 를 쿼리하여 개체를 연결할 수 있는지 여부를 확인합니다. 이 호출에 성공하면 클라이언트는 연결 가능한 개체의 IConnectionPointContainer 인터페이스에 대한 포인터를 보유하며 연결 가능한 개체 참조 카운터가 증가했습니다. 그렇지 않으면 개체를 연결할 수 없으며 나가는 인터페이스를 지원하지 않습니다.
- 개체를 연결할 수 있는 경우 클라이언트는 다음으로 연결 가능한 개체 내의 연결점에서 IConnectionPoint 인터페이스에 대한 포인터를 가져오려고 시도합니다. 이 포인터를 가져오는 방법에는 IConnectionPointContainer::FindConnectionPoint 와 IConnectionPointContainer::EnumConnectionPoints의 두 가지 방법이 있습니다. EnumConnectionPoints를 사용하는 경우 몇 가지 추가 단계가 필요합니다. 자세한 내용은 IConnectionPointContainer 사용을 참조하세요. 성공하면 연결 가능한 개체와 클라이언트가 모두 동일한 나가는 인터페이스를 지원합니다. 연결 가능한 개체는 이를 정의하고 호출하며 클라이언트는 이를 구현합니다. 그러면 클라이언트가 연결 가능한 개체 내의 연결 지점을 통해 통신할 수 있습니다.
- 그런 다음 클라이언트는 연결 지점에서 Advise 를 호출하여 싱크 인터페이스와 개체의 연결 지점 간에 연결을 설정합니다. 이 호출 후 개체의 연결점은 싱크의 나가는 인터페이스에 대한 포인터를 보유합니다.
- Advise 내의 코드는 전달된 인터페이스 포인터에서 QueryInterface를 호출하여 연결되는 특정 인터페이스 식별자를 요청합니다.
- 개체는 연결점에서 보유한 포인터를 사용하여 필요에 따라 싱크의 인터페이스에서 메서드를 호출합니다.
- 클라이언트는 Unadvise 를 호출하여 연결을 종료합니다. 그런 다음, 클라이언트는 IConnectionPoint::Release를 호출하여 연결 지점에서 보류를 해제하므로 연결 가능한 개체도 기본. 또한 클라이언트는 IConnectionPointContainer::Release를 호출하여 기본 연결 가능한 개체에 대한 보류를 해제해야 합니다.
관련 항목