IUnknown

컴퓨터 프로그래밍을 통해 마이크로소프트 윈도우의 애플리케이션에서 윈도우 API를 사용하면, IUnknown 인터페이스는 컴포넌트 오브젝트 모델(COM)의 근본적인 인터페이스이다. COM 사양은 COM 객체가 이 인터페이스를 구현해야 한다고 규정한다. 더욱이 다른 모든 COM 인터페이스는 IUnknown에서 파생되어야 한다. IUnknown은 모든 COM 객체의 두 가지 필수 기능을 노출한다: 참조 횟수 계산 방식을 통한 객체 수명 관리, 그리고 다른 인터페이스를 통한 객체 기능 접근이다. IUnknown은 마이크로소프트의 COM 및 DCOM 객체 모델의 기초적인 부분일 뿐만 아니라, 다른 플랫폼에서도 동일한 인터페이스의 구현체가 존재한다. 이는 다른 플랫폼이 어떤 형태의 COM 호환성을 구현하거나, 설계가 효과적이라고 판단되었기 때문이다.

IUnknown (또는 IUnknown에서 파생된) 인터페이스는 일반적으로 인터페이스에 선언된 함수를 구현하는 함수에 대한 포인터 목록을 인터페이스에 선언된 순서대로 포함하는 가상 메소드 테이블에 대한 포인터로 구성된다. 따라서 인프로세스 호출 오버헤드는 C++의 가상 메소드 호출과 동일하다.

메소드

IUnknown 인터페이스는 세 가지 메소드를 노출한다: QueryInterface, AddRef, 그리고 Release이다.

interface IUnknown {
  virtual HRESULT QueryInterface (REFIID riid, void **ppvObject) = 0;
  virtual ULONG   AddRef () = 0;
  virtual ULONG   Release () = 0;
};

IUnknown 인터페이스 ID는 {00000000-0000-0000-C000-000000000046} 값을 가진 전역 고유 식별자로 정의된다.

COM 컴포넌트의 인터페이스는 반사적, 대칭적, 전이적 속성을 보여야 한다. 반사적 속성은 주어진 인터페이스에서 인터페이스 ID를 사용하여 QueryInterface를 호출할 때 동일한 인터페이스 인스턴스를 반환할 수 있는 능력을 의미한다. 대칭적 속성은 인터페이스 A에서 QueryInterface를 통해 인터페이스 B가 검색될 때, 인터페이스 B에서도 인터페이스 A를 검색할 수 있어야 함을 요구한다. 전이적 속성은 인터페이스 A에서 인터페이스 B를 얻을 수 있고 인터페이스 B에서 인터페이스 C를 얻을 수 있다면, 인터페이스 C도 인터페이스 A에서 검색할 수 있어야 함을 요구한다.

집합, 포함 및 위임

집합이라는 개념으로 여러 COM 객체를 결합할 수 있다. 집합된 객체의 경우, IUnknown.QueryInterface() 호출의 반환 값은 쿼리된 객체의 구현 클래스와 다를 수 있다. 이것은 많은 인터페이스를 구현하는 COM 객체를 구축하는 방법이다. 이러한 집합 객체에서는 참조 기반 수명 관리를 하고 객체 전반에 걸쳐 동등성 관계를 유지하는 것이 매우 복잡하다.

대안 전략인 포함 및 위임은 객체 지향 소프트웨어 개발에서 복합 객체의 코드 디자인 스타일과 정확히 동일하며 그러한 복합 객체에 의해 구현되므로 더 일반적이다.

다른 플랫폼에서의 구현

같이 보기