CComPtr 类是一个智能COM接口指针类.我们可以为指定的接口指针类型量体裁衣地创建实例
如:
CComPtr<IUnknown> punk;
CComPtr<INamedObject> pno;
CComQIPtr 类是一个更智能的com接口指针类, 能够完成CComPtr的所有功能,以及更多的功能
如:
CComPtr<IUnknown> punk=/*初始化 iunknown */;
CCOMQIPtr<INamedObject> pno = punk;
CComDispatchDriver 类是智能的IDispatch接口指针
如:
CComVariant v;
CCOMDispatchDriver pdisp = /*init to object iDispatch*/;
HRESULT hr = pdisp->GetProperty(DISPID_COUNT,&V);// GET THE COUNT PROPERTY
CComPtr构造函数
CComPtr( ) {p==NULL};
CComPtr( T* lp ) {if((p=lp)!=NULL) p->AddRef();};
CComPtr ( const CComPtr< T >& lp )
{
if((p == lp.p)!=NULL) p->AddRef();
}
析构函数
~CComPtr() if(p) p-Release();
CCOMQIPtr 构造函数
当初始值与智能指针的类型相同时,这个构造函数与CComPtr 类一样,只是简单的对输入的接口指针调用AddRef.但是,当指定不同的类型来调用下面的构造函数时,构造函数会与输入的接口指针中查询适当的接口
CComQIPtr(IUnKnown* lp)
{
p=NULL;
if(lp!=NULL)
lp->QueryInterface(*piid,(void**)&p);
}
构造函数永远不会失败,然而QueryInferface调用可能会不成功,当不能获得被请求的接口时,
CComQIPtr会把内部的指针置为NULL
void func(IUnknown* punk)
{
CComQIPtr<INamedObject> pno(punk);
if(pno)
{
...
}
}
我们可以通过检查是否为null 指针,从而知道查询是否失败
对象实例化方法
智能接口指针类提供了一个被称为CoCreateInstance的重载方法,用它可以是实例化一个对象,并且获得对象的一个接口指针.提供2钟形式,第一种要求实例化类的类表识CLSID
第2钟要求实例化类的程序标识符ProgID
HRESULT CoCreateInstance(
LPCOLESTR szProgID,
LPUNKNOWN pUnkOuter = NULL,
DWORD dwClsContext = CLSCTX_ALL
) throw( );
HRESULT CoCreateInstance(
REFCLSID rclsid,
LPUNKNOWN pUnkOuter = NULL,
DWORD dwClsContext = CLSCTX_ALL
) throw( );
如:
ISpeaker* pSpeaker;
HRESULT hr = ::CreateInstance(__uuidof(Demagogue),NULL,CLSCTX,__uuidof(ISpeaker,(void**)&pSpeaker);
pSpeaker->Release();
CComPtr<ISpeaker> pSpeaker;
HRESULT hr = pSpeaker.CoCreateInstance(__uuidof(DEMAGOGUE));
CComPtr和CComQIPtr 的资源管理
我们必须在调用CoUninitialize方法之前释放所有的接口指针.这意味着如果申请的局部或全局变量,我们不能等到CComPtr的析构函数来释放指针.全局和静态变量的析构函数在主函数推出之后才执行。此时CoUninitialize早已完成
我们可以把智能指针赋值为NULL来释放内部的接口指针。也可以更明确的调用Release方法
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/bjwdxs/archive/2008/02/15/2096995.aspx