다음을 통해 공유


인터페이스 포인터 및 인터페이스

인터페이스 구현의 인스턴스는 실제로 메서드에 대한 포인터 배열에 대한 포인터입니다. 즉, 인터페이스에 지정된 모든 메서드의 구현을 참조하는 함수 테이블입니다. 인터페이스가 여러 개 있는 개체는 둘 이상의 함수 테이블에 대한 포인터를 제공할 수 있습니다. 배열에 액세스할 수 있는 포인터가 있는 코드는 해당 인터페이스의 메서드를 호출할 수 있습니다.

이 여러 간접 참조에 대해 정확하게 말하는 것은 불편하므로 대신 다른 개체가 메서드를 호출해야 하는 인터페이스 함수 테이블에 대한 포인터를 인터페이스 포인터라고 합니다. Visual C++ 또는 COM을 지원하는 다른 개체 지향 언어를 사용하여 C 애플리케이션에서 또는 거의 자동으로 함수 테이블을 수동으로 만들 수 있습니다.

적절한 컴파일러 지원(C 및 C++에 내재되어 있음)을 사용하면 클라이언트는 배열의 위치가 아니라 이름을 통해 인터페이스 메서드를 호출할 수 있습니다. 인터페이스가 형식이기 때문에 메서드의 이름이 지정된 컴파일러는 각 인터페이스 메서드 호출의 매개 변수 형식과 반환 값을 확인할 수 있습니다. 반면 클라이언트가 위치 기반 호출 체계를 사용하는 경우 C 또는 C++에서도 이러한 형식 검사를 사용할 수 없습니다.

각 인터페이스는 함수 메서드 그룹의 변경할 수 없는 계약입니다. IID(Globally Unique Interface Identifier)를 사용하여 런타임에 인터페이스를 참조합니다. COM에서 지원하는 GUID(Globally Unique Identifier)의 특정 인스턴스인 이 IID를 사용하면 클라이언트가 불필요한 오버헤드 없이 시스템에서 동일한 인터페이스의 여러 버전이 동일한 인터페이스의 여러 버전을 가질 수 있는 혼동 없이 인터페이스의 의미 체계를 지원하는지 여부를 정확하게 개체에 요청할 수 있습니다.

요약하자면 COM 인터페이스가 무엇인지 이해해야 하며 그렇지 않습니다.

  • COM 인터페이스는 C++ 클래스와 동일하지 않습니다. 순수 가상 정의는 구현을 수행하지 않습니다. C++ 프로그래머인 경우 인터페이스 구현을 클래스로 정의할 수 있지만 이는 COM에서 지정하지 않는 구현 세부 정보의 제목에 해당합니다. 인터페이스가 실제로 존재하려면 인터페이스를 구현하는 개체의 인스턴스를 만들어야 합니다. 또한 동작이 인터페이스 정의를 준수하는 한 다른 개체 클래스는 인터페이스를 다르게 구현할 수 있지만 이진 형식에서 서로 다른 방식으로 사용될 수 있습니다.
  • COM 인터페이스는 개체가 아닙니다. 단순히 관련 함수 그룹이며 클라이언트와 개체가 통신하는 이진 표준입니다. 인터페이스 메서드에 대한 포인터를 제공할 수 있는 한, 개체는 내부 상태 표현을 사용하여 모든 언어로 구현할 수 있습니다.
  • COM 인터페이스는 강력한 형식입니다. 모든 인터페이스에는 다른 명명 체계에서 발생할 수 있는 중복 가능성을 제거하는 고유한 인터페이스 식별자(GUID)가 있습니다.
  • COM 인터페이스는 변경할 수 없습니다. 이전 인터페이스의 새 버전을 정의하고 동일한 식별자를 제공할 수 없습니다. 인터페이스의 메서드를 추가하거나 제거하거나 의미 체계를 변경하면 이전 인터페이스의 새 버전이 아닌 새 인터페이스가 만들어집니다. 따라서 새 인터페이스는 이전 인터페이스와 충돌할 수 없습니다. 그러나 개체는 동시에 여러 인터페이스를 지원할 수 있으며 다른 식별자를 사용하여 인터페이스의 연속적인 수정 버전인 인터페이스를 노출할 수 있습니다. 따라서 각 인터페이스는 별도의 계약이며 시스템 전체 개체는 호출하는 인터페이스의 버전이 필요한지 여부에 대해 걱정할 필요가 없습니다. IID(인터페이스 ID)는 인터페이스 계약을 명시적이고 고유하게 정의합니다.

COM 개체 및 인터페이스