CComObject 类

此类为非聚合对象实现 IUnknown

语法

template<class Base>
class CComObject : public Base

参数

Base
类派生自 CComObjectRootCComObjectRootEx,以及对象上你要支持的任何其他接口。

成员

公共构造函数

名称 描述
CComObject::CComObject 构造函数。
CComObject::~CComObject 析构函数。

公共方法

名称 描述
CComObject::AddRef 递增对象的引用计数。
CComObject::CreateInstance (静态的)创建一个新的 CComObject 对象。
CComObject::QueryInterface 检索指向所请求的接口的指针。
CComObject::Release 递减对象的引用计数。

注解

CComObject 为非聚合对象实现 IUnknown。 但是,将 QueryInterfaceAddRefRelease 调用委托给 CComObjectRootEx

有关使用 CComObject 的详细信息,请参阅 ATL COM 对象的基础知识一文。

继承层次结构

Base

CComObject

要求

标头:atlcom.h

CComObject::AddRef

递增对象的引用计数。

STDMETHOD_(ULONG, AddRef)();

返回值

此函数返回新递增的对象引用计数。 此值可用于诊断或测试。

CComObject::CComObject

构造函数递增模块锁计数。

CComObject(void* = NULL);

参数

void*
[in] 不使用此未命名参数。 它的存在是为了与其他 CComXXXObjectXXX 构造函数保持对称。

备注

析构函数递减此参数。

如果使用 new 运算符成功构造了 CComObject 派生对象,则初始引用计数为 0。 若要将引用计数设置为正确的值 (1),请调用 AddRef 函数。

CComObject::~CComObject

析构函数。

CComObject();

注解

释放所有已分配的资源、调用 FinalRelease,并递减模块锁计数。

CComObject::CreateInstance

此静态函数允许你创建新的 CComObject<Base> 对象,且不产生 CoCreateInstance 开销。

static HRESULT WINAPI CreateInstance(CComObject<Base>** pp);

参数

pp
[out] 指向 CComObject<Base> 指针的指针。 如果 CreateInstance 不成功,则会将 pp 设置为 NULL。

返回值

标准 HRESULT 值。

备注

返回的对象的引用计数为零,因此请立即调用 AddRef,然后在完成后使用 Release 释放对象指针上的引用。

如果不需要直接访问对象,但仍希望创建一个新对象而没有 CoCreateInstance 开销,请改用 CComCoClass::CreateInstance

示例

class ATL_NO_VTABLE CMyCircle :
   public CComObjectRootEx<CComSingleThreadModel>,
   public CComCoClass<CMyCircle, &CLSID_MyCircle>,
   public IDispatchImpl<IMyCircle, &IID_IMyCircle, &LIBID_NVC_ATL_COMLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
   CMyCircle()
   {
   }

DECLARE_REGISTRY_RESOURCEID(IDR_MYCIRCLE)

DECLARE_NOT_AGGREGATABLE(CMyCircle)

BEGIN_COM_MAP(CMyCircle)
   COM_INTERFACE_ENTRY(IMyCircle)
   COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()



   DECLARE_PROTECT_FINAL_CONSTRUCT()

   HRESULT FinalConstruct()
   {
      return S_OK;
   }

   void FinalRelease()
   {
   }

public:

public:
   STDMETHOD(get_XCenter)(double* pVal);
};

 

// Create a local instance of COM object CMyCircle.
double x;
CComObject<CMyCircle>* pCircle;
HRESULT hRes = CComObject<CMyCircle>::CreateInstance(&pCircle);
ATLASSERT(SUCCEEDED(hRes));

// Increment reference count immediately
pCircle->AddRef();

// Access method of COM object
hRes = pCircle->get_XCenter(&x);

// Decrement reference count when done
pCircle->Release();
pCircle = NULL;

CComObject::QueryInterface

检索指向所请求的接口的指针。

STDMETHOD(QueryInterface)(REFIID iid, void** ppvObject);
template <class Q>
HRESULT STDMETHODCALLTYPE QueryInterface(Q** pp);

参数

iid
[in] 请求的接口的标识符。

ppvObject
[out] 一个指向 iid 所标识的接口指针的指针。 如果对象不支持此接口,则 ppvObject 设置为 NULL。

pp
[out] 指向类型 Q 标识的接口指针的指针。 如果对象不支持此接口,则 pp 设置为 NULL。

返回值

标准 HRESULT 值。

CComObject::Release

递减对象的引用计数。

STDMETHOD_(ULONG, Release)();

返回值

此函数返回新递减的对象引用计数。 在调试生成中,返回值可用于诊断或测试的值。 在非调试生成中,Release 始终返回 0。

另请参阅

CComAggObject 类
CComPolyObject 类
DECLARE_AGGREGATABLE
DECLARE_NOT_AGGREGATABLE
类概述