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) [完]
서버 수명 관리
DLL 서버의 특이한 것은, 그들 스스로 메모리에서 얼마나 머물러 있을 것인지를 제어한다는 것입니다. 일반적인 DLL 파일은 수동적이어서, 전적으로 그 DLL을 사용하는 어플리케이션에서 적재할 것인지, 적재 해제할 것인지에 따릅니다. 기술적으로 COM으로 만든 DLL 서버도 근본이 DLL 파일이기 때문에 수동적입니다. 그러나 COM 라이브러리는 서버가 COM 라이브러리에게 적재 해제해도 되는지를 결정할 수 있도록 기회를 주는 메커니즘을 가지고 있습니다.
이 작업은 앞서 설명한 내보내기된 함수 DllCanUnloadNow
가 수행합니다. 이 함수의 원형은 다음과 같습니다.
HRESULT DllCanUnloadNow();
COM 서버를 사용하던 클라이언트 어플리케이션이 유휴 시간 동안 COM 라이브러리 API인 CoFreeUnusedLibraries
를 실행하면, 어플리케이션이 적재하고 있는 모든 DLL 서버에게 하나씩 DllCanUnloadNow
함수를 실행하면서 각각 적재 해제 가능 여부를 확인합니다.
COM 서버가 좀 더 적재되어 있고자 한다면 S_FALSE
를 반환하고, 서버가 더 이상 메모리에 남아있을 이유가 없다고 판단하면 S_OK
를 반환하여 COM 라이브러리가 자신을 적재 해제하게 합니다.
COM 서버 스스로 메모리에서 적재 해제되어도 좋은지 여부를 확인하는 방법에는 레퍼런스 카운트가 있습니다. 레퍼런스 카운트를 사용한 DllCanUnloadNow
는 다음과 같이 구현할 수 있습니다.
extern UINT g_uDllRefCount; // COM 서버가 어플리케이션에 참조된 횟수
HRESULT DllCanUnloadNow() {
return (g_uDllRefCount > 0) ? S_FALSE : S_OK;
}
다음 절에서 레퍼런스 카운트가 어떻게 유지되는지 살펴보겠습니다.
계속 읽기
이전 게시글: COM의 소개(파트 2) – COM 서버의 이면 (2)
다음 게시글: COM의 소개(파트 2) – COM 서버의 이면 (4)