코딩캣: 코딩하는 고양이.
COM의 소개(파트 2) - COM 서버의 이면 (5)
API/COM
2020. 10. 8. 15:18

COM의 소개(파트 2) – COM 서버의 이면

본 게시물은 ‘codeproject.com’에 게시된 글 ‘Introduction to COM Part II - Behind the Scenes of a COM Server’을 번역한 것입니다.

원 게시물은 https://www.codeproject.com/Articles/901/Introduction-to-COM-Part-II-Behind-the-Scenes-of-a에 게재되어 있습니다. 최대한 원문에 적힌 의도를 반영하고자 하였으나, 우리말로 읽었을 때 보다 자연스럽게 하고자 부득이 어순과 어휘를 조정한 부분도 있음을 양해 바랍니다.

또한 본 게시물에서 언급하고 있는 예제 소스 코드는 Visual C++ 6.0을 기준으로 작성되어 있기 때문에 후속 버전의 Visual Studio(또는 Visual Studio .NET)에서 자동 생성되는 COM 코드와는 다소 차이가 있음을 감안하고 읽으시기 바랍니다.

  1. COM의 소개(파트 2) – COM 서버의 이면 (1)
  2. COM의 소개(파트 2) – COM 서버의 이면 (2)
  3. COM의 소개(파트 2) – COM 서버의 이면 (3)
  4. COM의 소개(파트 2) – COM 서버의 이면 (4)
  5. COM의 소개(파트 2) – COM 서버의 이면 (5)
  6. COM의 소개(파트 2) – COM 서버의 이면 (6)
  7. COM의 소개(파트 2) – COM 서버의 이면 (7)
  8. COM의 소개(파트 2) – COM 서버의 이면 (8)
  9. COM의 소개(파트 2) – COM 서버의 이면 (9) [完]

 

CoCreateInstance의 내부

필자의 이전 COM 소개글로 돌아가서, 우리는 COM 클라이언트가 COM 객체를 요청할 때 이를 생성하는 CoCreateInstance를 보았습니다. 클라이언트의 관점에서 이는 블랙박스입니다. 단지 적절한 파라미터를 제공하여 CoCreateInstance를 호출하기만 하면, 짜잔! 여러분은 COM 객체를 얻을 수 있습니다. 물론 어떤 흑마법(?)도 포함되어있지 않습니다. COM 서버를 적재하고, 요청한 COM 객체를 생성하고, 그리고 요청한 인터페이스의 형태로 번환해주기까지 잘 정의된 처리과정이 수행될 뿐입니다.

다음은 그 처리과정의 간략한 개요입니다. 몇 가지 낯선 용어들이 있습니다만, 걱정할 필요가 없습니다. 필자는 이후 절에서 모두 다룰 것이기 때문입니다.

1. 클라이언트 프로그램이 원하는 IIDCLSID를 전달하여 CoCreateInstance를 호출합니다.

2. COM 라이브러리는 HKEY\CLASSES_ROOT\CLSID의 하위 키들 중 해당 COM 서버의 CLSID를 찾습니다. 이 하위 키에는 COM 서버의 등록 정보가 들어 있습니다.

3. COM 라이브러리는 COM 서버 DLL의 전체 경로를 읽고 COM 클라이언트의 프로세스 공간 속으로 이 DLL을 적재합니다.

4. COM 라이브러리는 COM 클라이언트가 요청한 coclass를 만들 수 있는 클래스팩토리를 요청하기 위하여 COM 서버에 있는 DllGetClassObject 함수를 호출합니다.

5. 서버는 클래스팩토리를 생성하여 이를 DllGetClassObject를 통해 반환합니다.

6. COM 라이브러리는 클래스팩토리에 있는 CreateInstance를 호출하여 COM 클라이언트가 요청했던 COM 객체를 생성합니다.

7. CoCreateInstance는 COM 객체로부터 COM 클라이언트가 요청했던 인터페이스 포인터를 반환합니다.

 

계속 읽기

이전 게시글: COM의 소개(파트 2) – COM 서버의 이면 (4)

다음 게시글: COM의 소개(파트 2) – COM 서버의 이면 (6)

 

'API/COM' 카테고리의 다른 글
더 보기...
태그 : 
댓글