(com智能指针.docVIP

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
(com智能指针

12.1.7? 使用智能指针创建COM对象 1.问题阐述 利用COM的API创建COM对象,一切的处理工作都要程序员手动完成,比如接口指针最后的释放,这样如果在任务繁重的情况下,很容易出现忘记释放指针的情况,为了解决这个问题,COM能够提供一种自动释放的机制,于是引入了智能指针。 2.实现技巧 使用COM中的智能指针,使对象的创建工作更加简单化。而且它提供自动销毁生成的 COM的对象机制,使程序的精力转移到其他的方面。下面看一下ATL提供的两个智能指针—CcomPtr和CComQIPtr。 CcomPtr类实现客户端基本的COM引用计数模型,CComPtr有一个数据成员,它是一个未经过任何加工的COM接口指针。其类型被作为模板参数传递。 CComPtrIUnknown spUnk; CComPtrIFun spFun; 默认的构造函数将这个原始指针数据成员初始化为NULL。 智能指针的参数要么是原始指针,要么是相同类型的智能参数。不论哪种情况,智能指针都调用AddRef控制引用。CComPtr的赋值操作符既可以处理原始指针,也可以处理智能指针,并且在调用新分配指针的AddRef之前自动释放保存的指针。最重要的是,CComPtr的析构函数释放保存的接口(如果非空)。 CComQIPtr对于CComPtr只增加了两个成员函数,CComQIPtr有两个模板参数:一个是被操纵的指针类型,另一个是对应于这个指针类型的GUID。例如,下列代码声明了操纵IDataObject和IPersist接口的智能指针: CComQIPtrIFun, IID_IFun spUnk; CCom CComQIPtr的优点是它有重载的构造函数和赋值操作符。同类版本(例如,接收相同类型的接口)仅仅进行AddRef右边的赋值/初始化操作,这实际上就是CComPtr的功能。异类版本(接收类型不一致的接口)正确调用QueryInterface来决定是否这个对象确实支持所请求的接口: void f(IFun* spUnk) { CComQIPtrIFun, IID_IFun p; // 同类赋值 - AddRefs p = spUnk; CComQIPtrIDataObject, IID_IDataObject do; // 异类赋值 - QueryInterfaces do = spUnk; } 3.实例代码 本实例的目的借助于智能指针创建COM对象,建立一个基于对话框的工程。首先初始化应用工程的COM库,在CXXXXApp的InitInstance()中添加初始化语句: if(AfxOleInit()==FALSE) { AfxMessageBox(初始化环境COM库失败!); return FALSE; } 引入智能指针类,引入组件的CLSID、接口的ID及接口函数集: #include ..\Object\Object.h #include ..\Object\Object_i.c #include atlbase.h 智能指针操作代码如下: void CExample2Dlg::OnExeBtn() { UpdateData(TRUE); CComPtrIUnknown? spUnk;?????//定义IUnknown的智能指针 CComPtrIFun spFun;??????//定义IFun的智能指针 try { HRESULT hr = spUnk.CoCreateInstance(CLSID_Fun,NULL, CLSCTX_INPROC_SERVER);????//启动组件 if(FAILED(hr)) { MessageBox(组件没有注册!); return ; } hr = spUnk.QueryInterface(spFun);??//查找IFun的接口 if(FAILED(hr)) { MessageBox(没有接口IFun); return; } spFun-Add(m_add1,m_add2,m_add3); CComBSTR s1(m_str1); CComBSTR s2(m_str2); CComBSTR s3; spFun-CatString(s1,s2,s3); m_str3 = convert(s3.m_str);? ???//将BSTR转换为CString 同上 } catch(LPCTSTR str) { MessageBox(str); } UpdateData(FALSE);? } 上面的代码演示了使用CcomPtr智能指针,下面的代码演示了CComQIPtr的用法: void CExample2Dlg::OnComqiBtn() { ?UpdateData(TRUE); CComPtrIUnkn

文档评论(0)

84537592 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档