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

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

 

서버 수명 관리

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)

 

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