다음을 통해 공유


CComObjectRootEx::FinalConstruct

 

게시: 2016년 4월

사용자 개체에 필요한 모든 초기화를 수행 하도록 파생된 클래스에서이 메서드를 재정의할 수 있습니다.

구문

HRESULT FinalConstruct( );

반환 값

반환 S_OK 성공 또는 표준 오류 중 하나에 HRESULT 값입니다.

설명

기본적으로 CComObjectRootEx::FinalConstruct 단순히 반환 S_OK.

장점에 대 한 초기화를 수행 하는 FinalConstruct 클래스의 생성자 대신:

  • 생성자에서 상태 코드를 반환할 수 없습니다 하지만 반환할 수는 HRESULT 통해 FinalConstruct의 값을 반환 합니다. ATL에서 제공 하는 표준 클래스 팩터리를 사용 하 여 클래스 개체를 만들고 있을 때 자세한 오류 정보를 제공 하므로 COM 클라이언트에 반환 값이 전파 됩니다.

  • 클래스의 생성자에서 가상 함수 메커니즘을 통해 가상 함수를 호출할 수 없습니다. 이때 상속 계층 구조에 정의 된 대로 클래스의 생성자에서 가상 함수를 호출 호출 함수를 정적으로 해결 됩니다. 순수 가상 함수를 호출 하는 링커 오류가 발생 합니다.

    클래스 상속 계층 구조에서 가장 많이 파생 된 클래스 아닙니다-기능의 일부를 제공 하는 ATL에서 제공 하는 파생된 클래스에 의존 합니다. 초기화 해야 합니다 (클래스 개체를 다른 개체를 집계 해야 하는 경우이 확실히 그렇습니다) 해당 클래스에서 제공 하는 기능을 사용 하는 가능성이 되었지만 생성자를 클래스에 기능에 액세스할 수 없습니다. 생성 코드 클래스에는 가장 많이 파생 된 클래스를 완전히 구성 하기 전에 실행 됩니다.

    그러나 FinalConstruct 가장 많이 파생 된 후 클래스 완전히 가상 함수를 호출 하 고 ATL에서 제공 하는 참조 횟수 구현에 사용할 수 있도록 생성 되는 즉시 호출 됩니다

예제

일반적으로이 메서드를 파생 클래스에서 재정의 CComObjectRootEx 만들려면 개체를 집계 합니다. 예를 들면 다음과 같습니다.

class ATL_NO_VTABLE CMyAggObject :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMyAggObject, &CLSID_MyAggObject>,
   public IDispatchImpl<IMyAggObject, &IID_IMyAggObject, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
   DECLARE_GET_CONTROLLING_UNKNOWN()
   HRESULT FinalConstruct()
   {
      return CoCreateInstance(CLSID_MyCustomClass, GetControllingUnknown(), 
         CLSCTX_ALL, IID_IUnknown, (void**)&m_pMyCustomClass);
   }

   IMyCustomClass* m_pMyCustomClass;

   // Remainder of class declaration omitted.

생성에 실패 하면 오류를 반환할 수 있습니다. 또한 매크로 사용할 수 있습니다 DECLARE_PROTECT_FINAL_CONSTRUCT 되 외부 개체를 보호 하기 위해 삭제 만드는 동안 집계 된 내부 개체 참조 카운트 후 감소 카운트 0 증가 하는 경우.

집계를 생성 하는 일반적인 방법은 다음과 같습니다.

  • 추가 된 IUnknown 클래스에 대 한 포인터 및 개체를 초기화 NULL 생성자에.

  • 재정의 FinalConstruct 집계를 만들 수 있습니다.

  • 사용 된 IUnknown 포인터를 매개 변수로 정의 COM_INTERFACE_ENTRY_AGGREGATE 매크로.

  • 재정의 FinalRelease 를 해제 하는 IUnknown 포인터.

요구 사항

헤더: atlcom.h

참고 항목

CComObjectRootEx Class
CComObjectRootEx::FinalRelease
DECLARE_GET_CONTROLLING_UNKNOWN