'COM & ATL'에 해당되는 글 1건

  1. 2010.08.12 COM 컴포넌트가 갖추어야 할 기능 3가지

#1  레지스트리 등록/해제

#2  IUnkonown 인터페이스  구현

#3  클래스 펙토리 컴포넌트-1

 

공통적으로 또는 기본적으로 모든 COM 컴포넌트가  갖추어야 할 내용들중에

#1, #2 는 앞에서  언급됬던 내용들이여서 생략한다.

 

이제 클래스펙토리 컴포넌트( 이제부터 컴포넌트를 객체라는 용어와 혼용되도 

이해가 가능할 것 같애서 그냥 "객체"라고 하자. )

에 대해서 알아보자.

 

클래스 팩토리( Class Factories : 객체공장@@)

정의 :  객체를 생성하고 소멸시킬 때 COM 서브시스템에서 사용된다. 그래서 모든 서버는

           이 객체를 제공해야 한다. 

 

클래스팩토리 객체의 쓰임 시나리오 :

  -> 도대체 COM 서브시스템은 어떻게 클래스 팩토리 객체를 사용하는 것일까? 알아보자

 

인프로세스 서버인 경우 쓰임

 

  1. COM 클라이언트가 컴포넌트 요구

      2. COM 서브시스템이 요구사항을 받음.

           -> 레지스트리에서 요구된 서버를 찾는다.

           -> 레지스트레서 요구된 서버 정보를 찾았다면

           -> 이정보를 가지고 DLL를 메모리에 올린다.

           -> 인프로세스 서버가 필수적으로 구현해야 하는 함수

                DllGetClassObject() 를 호출

 

           3. 컴포넌트 안(객체)에서  함수 실행

               DllGetClassObject()

              {

                   // 클래스팩토리 객체 생성

                   // 클래스팩토리 객체를 이용해서 요구된 컴포넌트(객체)를 생성한다.

              }

 

 

로컬 서버인 경우 쓰임

 

  1. COM 클라이언트가 컴포넌트 요구

      2. COM 서브시스템이 요구사항을 받음.

           -> 레지스트리에서 요구된 서버를 찾는다.

           -> 레지스트레서 요구된 서버 정보를 찾았다면

           -> 이정보중에

               로컬서버가 필수로 구현해야 하는 함수

               CoRegisterClassObject() 호출

 

           3. 컴포넌트 안(객체)에서  함수 실행

               CoRegisterClassObject()

              {

                    // 클래스팩토리 객체를 레지스트리에 등록한다.

                   // 클래스팩토리 객체 생성

                   // 클래스팩토리 객체를 이용해서 요구된 컴포넌트(객체)를 생성한다.

              }

 

#3  클래스 펙토리 컴포넌트-2

클래스팩토리 객체는 하나의 컴포넌트이다.

 

여기에도 인터페이스를 가지고 있는데,

이것이 IClassFactory란 이름의 표준 인터페이스를 통해서 클래스 팩토리

프로토콜이 제공되고 있다.

 

// IClassFactory 클래스

class IClassFactory : public IUnknown

{

      virtual HRESULT CreateInstance( IUnknown *pUnkOuter ,

                                                      REFIID riid,

                                                      void **ppvObject) = 0;

      virtual HRESULT LockServer(BOOL fLock) = 0;

};

 

와 같이 인터페이스 선언되어져 있다.

IClassFactory  의  핵심은 CreateInstance 이다. 

이 인터페이스의 역활은 다음과 같다.

 

               - 새로운 객체를 생성

               - 생성한 객체중 요구된 인터페이스 포인터 반환

 

CreateInstance

 - pUnkOuter 매개변수 :  이것은 컴 통합(aggregation)과 관련되어 있다.

                                이것은 현재 컴포넌트가 다른 컴포넌트의 내부로

                                통합될때 의미가 있다.  이건 나중에 다루도록 하자.

 

LockServer

 - 잠금카운트, 즉 객체의 생성과 해제를 자주하는 클라이언트에 대해 성능을

   보장해 주기 위하여 사용된다. 

   규칙적으로 객체를 생성하고, 짧은 기간동안 사용한 다음, 해제하는 것을 반복하는

   클라이언트가 있을때, 이것은 OS에게 많은 무리를 준다.

   생성하고, 해제하는 과부하게 걸리게 된다.

   이런 클라이언트를 만났을지라도 효율적으로 사용할수 있도록  잠금카운터가 있는 것이다.

  

   사실 서버는 객체카운와 참조카운트 모두 0이 되었을때 메모리에서 해제된다.

   "생성-사용-해제-반복"패턴을 가진 클라이언트를 만났을지라도 딱 한번만 메모리에

   올라와서 객체 카운트와 참조카운트가 0이 되었을때만 메모리에서 해제된다고 한다. 

 

Posted by ... XJAPAN
TAG
이전버튼 1 이전버튼