= 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]