CComPtr智能指针

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

你可能感兴趣的:(CComPtr智能指针)