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
인터페이스 포인터를 얻기까지의 과정이다.