CComObjectRootEx::FinalConstruct

 

您可以重写在派生类中实现此方法执行为您的对象所需的所有初始化。

语法

HRESULT FinalConstruct( );

返回值

返回在成功或之一的 S_OK 标准错误 HRESULT 值。

备注

默认情况下,CComObjectRootEx::FinalConstruct 返回 S_OK

有一些优点。执行初始化。FinalConstruct 而不是您的选件类构造函数:

  • 您不能返回从构造函数的状态代码,但是,您可以FinalConstruct的返回 HRESULT 返回值。当您的选件类创建对象时使用ATL时提供的标准选件类工厂,则返回值传播回COM客户端可以提供为详细的错误信息。

  • 无法通过从选件类的构造函数的虚函数机制调用虚函数。在继承层次结构,则当时定义从生成静态解析选件类的构造函数中的虚函数调用函数。调用纯虚函数在链接器错误的结果。

    您的选件类不是在继承层次结构的派生类(它依赖于ATL提供的派生类提供了一些其功能。有可能您的初始化需要使用该选件类提供的功能(这必须为true,则选件类对象需要复合其他对象)时,但是,在您的选件类的构造函数没有方式访问这些功能。派生类完全构造之前,您的选件类的构造代码执行。

    但是,派生类完全构造可以调用虚函数和使用ATL之后,提供的一个引用计数的实现 FinalConstruct 调用。

通常,请重写在从 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.

如果该构造失败,则可以返回false。如果为,则在创建时,内部进行聚合的对象会递增引用计数递减然后计数为0,也可以使用宏 DECLARE_PROTECT_FINAL_CONSTRUCT 保护您的已从+中删除的外部对象。

这是一个典型方式创建复合:

  • 添加一 IUnknown 指向您的选件类对象并将其初始化为在构造函数中 NULL

  • 重写 FinalConstruct 创建聚合。

  • 使用可以定义作为参数传递给 COM_INTERFACE_ENTRY_AGGREGATE 宏的 IUnknown 指针。

  • 重写释放 IUnknown 指针的 FinalRelease

要求

Header: atlcom.h

请参阅

CComObjectRootEx Class
CComObjectRootEx::FinalRelease
DECLARE_GET_CONTROLLING_UNKNOWN