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 코드와는 다소 차이가 있음을 감안하고 읽으시기 바랍니다.
- COM의 소개(파트 2) – COM 서버의 이면 (1)
- COM의 소개(파트 2) – COM 서버의 이면 (2)
- COM의 소개(파트 2) – COM 서버의 이면 (3)
- COM의 소개(파트 2) – COM 서버의 이면 (4)
- COM의 소개(파트 2) – COM 서버의 이면 (5)
- COM의 소개(파트 2) – COM 서버의 이면 (6)
- COM의 소개(파트 2) – COM 서버의 이면 (7)
- COM의 소개(파트 2) – COM 서버의 이면 (8)
- COM의 소개(파트 2) – COM 서버의 이면 (9) [完]
CoCreateInstance의 내부
필자의 이전 COM 소개글로 돌아가서, 우리는 COM 클라이언트가 COM 객체를 요청할 때 이를 생성하는 CoCreateInstance
를 보았습니다. 클라이언트의 관점에서 이는 블랙박스입니다. 단지 적절한 파라미터를 제공하여 CoCreateInstance
를 호출하기만 하면, 짜잔! 여러분은 COM 객체를 얻을 수 있습니다. 물론 어떤 흑마법(?)도 포함되어있지 않습니다. COM 서버를 적재하고, 요청한 COM 객체를 생성하고, 그리고 요청한 인터페이스의 형태로 번환해주기까지 잘 정의된 처리과정이 수행될 뿐입니다.
다음은 그 처리과정의 간략한 개요입니다. 몇 가지 낯선 용어들이 있습니다만, 걱정할 필요가 없습니다. 필자는 이후 절에서 모두 다룰 것이기 때문입니다.
1. 클라이언트 프로그램이 원하는 IID
와 CLSID
를 전달하여 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)