Поделиться через


CComObjectRootEx::FinalConstruct

Этот метод можно переопределить в производном классе для выполнения любой инициализации требуемая для конкретного объекта.

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.

Требования

Header: atlcom.h

См. также

Ссылки

CComObjectRootEx, класс

CComObjectRootEx::FinalRelease

DECLARE_GET_CONTROLLING_UNKNOWN