title: "COM Architecture: 사용, interface"
description: "COM Architecture: 사용, interface"
cleanUrl: /sw-engineer/com-architecture-use-interface
ogImage: "<https://anyflower.notion.site/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7570d2fc-66b1-4e23-bb3c-ff7b56842b0d%2Fa0bdaeff-6cee-4009-b427-9bf3df260735%2FUntitled.png?table=block&id=c7bd81c5-c409-4e93-be89-e4241e5b3f03&spaceId=7570d2fc-66b1-4e23-bb3c-ff7b56842b0d&width=1230&userId=&cache=v2>"
floatFirstTOC: right

IUnknown 인터페이스QueryInterface(), AddRef(), Release()세 가지의 메서드를 노출한다.
QueryInterface()는 COM 개체가 노출하는 여러 서비스(즉 인터페이스)에 client가 접근 가능하도록 하며, AddRef()와 Release()는 여러 클라이언트가 동일 개체에 접근했을 시, 참조 횟수를 관리함으로 자신의 파괴 시점을 결정하도록 한다.
vptr)가 IUnknown 파생 인터페이스의 메서드 참조를 나타낸다. C++ 표준과 달리(표준은 vptr의 존재를 요구하지도 않는다) COM은 virtual table layout을 규정하며, 특히 첫 세 개의 method는 위와 같이 QueryInterface(), Addref(), Release() 순으로 나타나야 한다.설치시 모든 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 인터페이스 포인터를 얻기까지의 과정이다.
