_com_ptr_t的使用
来源:互联网 发布:判断质数的c语言编程 编辑:程序博客网 时间:2024/06/13 08:28
_com_ptr_t的使用
对于COM调用,大量的AddRef/Release调用无疑是例行公事和让人生厌。
_com_ptr_t 是vc运行库中提供的固有的封装COM接口的智能指针,相比CComPtr/CComQIPtr缺少移植性,但是支持不是ATL实现部分的的异常和操作。
以下是DirectShow中播放一个文件的代码:
IGraphBuilder *pGraph;
IMediaControl *pMediaControl;
IMediaEvent *pEvent;
// Create the filter graph manager and query for interfaces.
CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER,
IID_IGraphBuilder, (void **)&pGraph);
pGraph->QueryInterface(IID_IMediaControl, (void **)&pMediaControl);
pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);
// Build the graph. IMPORTANT: Change string to a file on your system.
pGraph->RenderFile(L"C://Example.avi", NULL);
// Run the graph.
pMediaControl->Run();
// Wait for completion.
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
// Clean up.
pMediaControl->Release();
pEvent->Release();
pGraph->Release();
使用com_ptr_t后简单了很多:
//这部分可以放到头文件中
#include
_COM_SMARTPTR_TYPEDEF( IGraphBuilder , __uuidof(IGraphBuilder) );
_COM_SMARTPTR_TYPEDEF( IMediaControl , __uuidof(IMediaControl) );
_COM_SMARTPTR_TYPEDEF( IMediaEvent , __uuidof(IMediaEvent) );
...
IGraphBuilderPtr pGraph( CLSID_FilterGraph ) ;//调用CreateInstance
IMediaControlPtr pMediaControl = pGraph;//这里会自动调用QueryInterface
IMediaEventPtr pEvent = pGraph;//这里会自动调用QueryInterface
pGraph->RenderFile( L"L"C://Example.avi", NULL);
// Run the graph.
pMediaControl->Run();
// Wait for completion.
long evCode;
pEvent->WaitForCompletion(INFINITE, &evCode);
//不需要调用Release()
假如我们要复制一个接口,常常要
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(); 将会两次释放接口指针。
- _com_ptr_t的使用
- _com_ptr_t的使用
- _com_ptr_t的使用
- _com_ptr_t的使用
- 智能指针 _com_ptr_t的使用
- 补一点COM的知识,有关_com_ptr_t
- 有效的使用和设计COM智能指针 ——条款5:了解_com_ptr_t 设计背后的历史原因
- 智能指针_com_ptr_t
- GUID使用的使用
- ${}的使用
- 的使用
- @[],@()的使用
- ->的使用
- +、-、*、/、%的使用
- &&的使用
- %:的使用
- Makefile中使用$$的使用
- Makefile中使用$$的使用
- win2003 asp.net 搭建 与 SQL Server 2005 建立数据库
- [转载]软件架构师之路
- Apache HTTP Server 与 Tomcat 的三种连接方式
- Learning Curve
- Smartphone中文模拟器本地化文件下载地址
- _com_ptr_t的使用
- 软件质量之路(1):软件质量框架
- CSS学习要点
- 论“适可而止”!
- 深入理解.NET内存回收机制
- windows xp sp2自带防火墙设置详细讲解
- 利用Ajax控件实现无刷新
- FFMPEG的手册
- test