CComObject 类
此类为非聚合对象实现 IUnknown
。
语法
template<class Base>
class CComObject : public Base
参数
Base
类派生自 CComObjectRoot 或 CComObjectRootEx,以及对象上你要支持的任何其他接口。
成员
公共构造函数
名称 | 描述 |
---|---|
CComObject::CComObject | 构造函数。 |
CComObject::~CComObject | 析构函数。 |
公共方法
名称 | 描述 |
---|---|
CComObject::AddRef | 递增对象的引用计数。 |
CComObject::CreateInstance | (静态的)创建一个新的 CComObject 对象。 |
CComObject::QueryInterface | 检索指向所请求的接口的指针。 |
CComObject::Release | 递减对象的引用计数。 |
注解
CComObject
为非聚合对象实现 IUnknown。 但是,将 QueryInterface
、AddRef
和 Release
调用委托给 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
类概述