IUnknown Interface

COM 객체의 핵심을 이루는 인터페이스.
컴자체가 바이너리 모델이 거의 C++을 유사한 형태로 가져온 만큼 C++ 모습을 보면 대략 어떤 향태인지를 추측할 수 있다.


~cpp
// c++ implementation
class IUnknown
{
public:
virtual HRESULT QueryInterface(REFIID riid, void** ppvObject) = 0;
virtual ULONG AddRef() = 0;
virtual ULONG Release() = 0;
}

// c implementation
typedef struct IUnknown IUnknown

typedef struct {
HRESULT (*QueryInterface) (IUnknown *This, REFIID *This, REFIID riid, void** ppvObject);
ULONG (*AddRef) (IUnknown *This);
ULONG (*Release) (IUnknown *This);
} IUnknownVtable;

typedef struct {
struct IUnknownVtable * lpVtable;
} IUnknown;

각 메소드 역할

QueryInterface

COM 객체를 다루는데 있어서 가장 핵심적인 인터페이스. REFIID 를 이용해 ID 에 맞는 인터페이스 포인터를 얻을 수 잇다.

AddRef, Release

COM 객체의 참조카운팅을 조절한다.
COM 객체를 다른 포인터에 할당하거나 NULL 로 초기화 할 때 호출하여 참조카운터를 올바르게 유지해야만 객체의 정상적인 소멸을 보장할 수 있다.
※ 이론적인 내용은 C++ 의 스마트 포인터 파트를 참조. 참조카운팅의 용도와 필요성에 대해서 숙지한다.
C++ 스마트 포인터에서는 참조 카운팅을 이용해서 dangling pointer 문제를 해결한다. boost 의 shared_ptr이 이를 구현한다.

주의점

IUnknown 은 구현체가 유효한 기간동안 인터페이스 포인터를 변경시키면 안된다.
인터페이스 포인터는 QueryInterface(IID_IUnknown, (void**) &pIUnknownInterface) 를 통해서 얻을 수 있으며, 이의 유효를 검사하는 것이 가능하다.
정상규현된 컴포넌트라면 인터페이스 포인터를 비교하는 것을 통해서 각 객체가 같은 컴포넌트의 인스턴스인지 확인이 가능하다.

----
COM
Retrieved from http://wiki.zeropage.org/wiki.php/COM/IUnknown
last modified 2021-02-07 05:22:41