Search
Duplicate
👁️

COM Architecture : 사용, interface

Category
S/W 엔지니어
Tags
COM
Created time
2008/01/11

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의 서브트리에 ProgIDCLSID로 이루어진 두 개의 엔트리가 등록된다. 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
댓글 백업