참고:
본 글은 COM(Component Object Model)의 개념을 재정리하기 위해 스터디용으로 작성되었습니다.

COM 개체의 사용

사용자 삽입 이미지


- 바이너리 수준 재사용을 지원하는 COM은 GUID로 표현되는 자신의 ClassID를 Registry에 등록되어야 하며, COM Client는 COM Runtime Library를 통해 등록된 COM 개체를 ClassID를 통해 식별한다. 또한 COM Runtime Library는 COM Client가 COM 개체를 찾고 인스턴스화 할 수 있는 수단을 제공한다.
- COM 위치 투명성을 제공하기에, COM client는 COM 개체가 자신과 동일한 프로세스(in-process)에건, 동일 컴퓨터의 타 프로세스에건, 원격지 컴퓨터 프로세스에 위치하건 관여할 필요가 없다.

COM Interface
- COM 개체가 제공하는 서비스는 IID(Interface IDentifier: GUID로 표현됨)로 식별되는 인터페이스를 통해 노출된다.
IUnknown 인터페이스
- COM 컴포넌트가 반드시 구현해야 하는 인터페이스. QueryInterface(), AddRef(), Release() 세 가지의 메서드를 노출한다.
- QueryInterface()는 COM 개체가 노출하는 여러 서비스(즉 인터페이스)에 client가 접근 가능하도록 하며, AddRef()Release()는 여러 클라이언트가 동일 개체에 접근했을 시, 참조 횟수를 관리함으로 자신의 파괴 시점을 결정하도록 한다.

사용자 삽입 이미지

- 위 그림은 C++ virtual table pointer(이하 vptr)가 IUnknown 파생 인터페이스의 메서드 참조를 나타낸다. C++ 표준과 달리(표준은 vptr의 존재를 요구하지도 않는다) COM은 virtual table layout을 규정하며, 특히 첫 세 개의 method는 위와 같이 QueryInterface, Addref, Release 순으로 나타나야 한다.

COM Registry 엔트리
- 설치시 모든 COM 개체는 Registry에 등록되어야 한다. 기본적으로 HKEY_CLASSES_ROOT의 서브트리에 ProgID와 CLSID로 이루어진 두 개의 엔트리가 등록된다. CLSIDFromProgID()를 통해 식별가능 문자열인 ProgID로부터 해당 CLSID를 얻어낼 수 있다. C++와는 달리, Visual Basic 같은 타 언어 기반 클라이언트는 ProgID를 통해 COM을 찾아내므로 ProgID도 반드시 함께 등록되어야 한다.

사용자 삽입 이미지


CoCreateInstance()
를 이용한 COM 객체 생성
- 사용하고자 하는 COM 개체의 CLSID를 얻었으면, CLSID와 기타 필요 인수를 넘김으로 CoCreateInstance()를 호출하여 해당 개체를 생성하고 IUnknown 인터페이스 포인터를 얻는다. 다음 그림은 CoCreateInstance()를 호출하여 해당 개체의 IUnknown 인터페이스 포인터를 얻기까지의 과정이다.

사용자 삽입 이미지


reference:
Desktop Applications with Microsoft Visual C++ 6.0 MCSD Training Kit, MSDN
Posted by 어쨌건간에