转载自:http://blog.csdn.net/wishfly/archive/2007/05/27/1627528.aspx
对于COM调用,大量的AddRef/Release调用无疑是例行公事和让人生厌。
_com_ptr_t 是vc运行库中提供的固有的封装COM接口的智能指针,相比CComPtr/CComQIPtr缺少移植性,但是支持不是ATL实现部分的的异常和操作。
以下是DirectShow中播放一个文件的代码:
使用com_ptr_t后简单了很多:
假如我们要复制一个接口,常常要
pG1 = pG2;
pG1->AddRef();
...
pG1->Release();
对于_com_ptr_t , 只要pG1 = pG2;就可以了
注意以下的代码:
IGraphBuilderPtr pGraph ;
pGraph.CreateInstance( CLSID_FilterGraph );
...
CoUninitialize();
因为 pGraph 会在超出作用域时析构,也就是在CoUninitialize()之后调用 IUnkown::Release() ,这样会引起问题,可以这样解决:
pGraph.Release(); CoUninitialize();
或者
pGraph = NULL; CoUninitialize(); //这样会隐含的调用_com_ptr_t::Release()
绝对不可以调用 pGraph->Release(); 因为这是调用IUnkown::Release()然后再调用一次pGraph.Release(); 将会两次释放接口指针。