^(코딩캣)^ = @"코딩"하는 고양이;

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

API/COM
2020. 10. 8. 07:41

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) [完]

 

COM 서버 훑어보기

본 글에서 우리는 가장 간단한 COM 서버인 ‘인 프로세스 서버(in-process server)’ 형태의 서버에 대해 살펴보겠습니다.

‘인 프로세스(in-process)’라는 말은 클라이언트 프로그램의 프로세스 영역에 COM 서버가 적재(load)된다는 뜻입니다. ‘인 프로세스(줄여서 in-proc)’ 서버는 항상 DLL 파일 형태로 존재하고, 클라이언트 프로그램이 설치된 컴퓨터와 같은 컴퓨터에 설치되어야 합니다.

 

인 프로세서 서버는 COM 라이브러리가 사용하기 전에 다음의 두 조건을 만족해야 합니다.

1. HKEY_CLASSES_ROOT\CLSID의 하위 키로 적절하게 등록되어 있어야 합니다.

2. DllGetClassObject라는 이름의 함수를 내보내야(export)합니다.

 

위의 두 조건은 여러분이 인 프로세스 서버를 작동시키기 위하여 필요한 최소한의 조건입니다. HKEY_CLASSES_ROOT\CLSID의 하위 키 이름은 COM 서버의 GUID여야 합니다. 그리고 키는 COM 서버의 위치와 스레드 모델에 대한 값을 반드시 가지고 있어야 합니다.

DllGetClassObject 함수는 COM 라이브러리가 CoCreateInstance API에 따라 작업을 수행할 때 호출되는 함수입니다.

COM 서버는 또한 다음의 세 가지 함수를 내보내야(export) 합니다.

DllCanUnloadNow
COM 서버가 메모리에서 적재 해제될 수 있는지 COM 라이브러리에서 확인하고자 할 때 호출되는 함수입니다.
DllRegisterServer
regsvr32와 같은 설치 유틸리티가 COM 서버를 등록하는 과정에서 호출되는 함수입니다.
DllUnregisterServer
regsvr32와 같은 설치 제거 유틸리티가 COM 서버를 등록 해제할 때 DllRegisterServer가 생성한 레지스트리 키를 삭제하기 위해 호출되는 함수입니다.

 

물론 위와 같은 함수들을 단순히 내보낸다고 해서 되는 것은 아니고, COM 기술 사항을 준수해야 COM 라이브러리와 COM 클라이언트에서 이 COM 서버를 사용할 수 있습니다.

 

계속 읽기

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

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

 

카테고리 “API/COM”
more...