COM接口与对象学习心得150901.docVIP

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

COM对象与接口学习心得 1 引言 COM是Microsoft提出的一种二进制兼容构件的规范,只要遵守这种规范,不管用什么编程语言和工具开发的COM构件,也不管是否运行在同一台机器上,还是运行在不同的机器上,都可以被使用。COM是建立在二进制层次上的调用标准,与编程语言和开发工具无关;COM定义了大量的标准规范接口(如IUnknown、IClassFactory、IDispatch等等)用于各种不同的用途。如今,COM成了微软跟上因特网快速发展的重要基础技术,在windows平台上,COM随处可见。 COM对象是指符合面向对象设计中对象的基本概念,通过COM接口提供服务的COM组件的实例。COM接口是客户与对象之间的通信协议,对象实现COM接口,客户调用COM接口。COM对象由GUID唯一标识,通常可以实现多个接口。COM接口由CLSID标识,它不能被独立使用,要求必须存在于某个COM对象上,COM接口提供的功能是与语言、平台和编译器无关的。 2 静态链接与动态链接 C++程序的链接按照时间可以分为静态链接和动态链接。动态链接是在运行时与库函数进行链接,它使得不同的程序开发者能够相对独立地开发和测试自己的程序模块,从某种意义上来讲大大促进了程序的开发效率,原先限制程序的规模也随之扩大;静态链接是在编译的时候与库函数进行连接,会将静态库中的所有方法都编译到应用程序中。C++的动态链接是符合COM接口设计需要的。 静态链接的优点:代码装载速度快,执行速度略比动态链接库快; 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。缺点:使用静态链接生成的可执行文件体积较大,包含相同的公共代码,造成浪费。 动态链接优点:更加节省内存并减少页面交换;DLL文件与EXE文件独立,只要输出接口不变(即名称、参数、返回值类型和调用约定不变),更换DLL文件不会对EXE文件造成任何影响,因而极大地提高了可维护性和可扩展性;不同编程语言编写的程序只要按照函数调用约定就可以调用同一个DLL函数;适用于大规模的软件开发,使开发过程独立、耦合度小,便于不同开发者和开发组织之间进行开发和测试。缺点:使用动态链接库的应用程序不是自完备的,它依赖的DLL模块也要存在,如果使用载入时动态链接,程序启动时发现DLL不存在,系统将终止程序并给出错误信息。而使用运行时动态链接,系统不会终止,但由于DLL中的导出函数不可用,程序会加载失败;速度比静态链接慢。 3 客户与对象之间的通信 C++的封装是语法上的封装,而不是二进制封装,其对象创建与释放的运算符new/delete是编译器相关的,编译器不仅要知道类的public信息,也要知道private信息。C++对象的二进制结构是编译器相关的,即使客户看到的C++类公开接口没有变化,但是C++类的实现改变了,仍然会打破客户与对象之间的连接。 在对COM接口进行设计时,应使客户与C++对象之间的连接点越小越好,尽可能地只有接口部分必要的信息才放入接口,把C++类的实现细节与接口分开,提取出针对所有编译器都不变的因素作为客户与对象共享的接口信息。 C++纯虚基类的设计可以很好地解决COM接口的设计问题。纯虚基类只包含了虚函数,限定每个虚函数的调用规则,在给定的平台上所有的编译器都会产生同样的二进制结构。对于跨平台的情形,需要通过中间层,这里暂不考虑。纯虚基类的使用解决了方法实现的命名冲突,也解决了C++类中二进制布局不兼容的问题,客户只能看到vtable,没有看到其他的实现细节,保证了不同语言编写的程序可以互操作,也可以在不改变接口的情况下,可以单独升级客户或者对象。 例如定义一个接口IString,它包含了两个纯虚方法。 class IString { virtual const char*Find(const char *psz)=0; virtual int Length()=0; }; 类CMyString实现了IString定义的接口(具体实现略)。 class CMyString : public IString { private: char *m_psz; public: CMyString(const char * psz); ~CMyString(); const char*Find(const char *psz); int Length(); }; 如果不使用C++的运算符,客户如何得到IString的虚表接口呢?可以提供一个引出函数供客户使用,隐藏创建对象的内部细节。 extern C _declspec(dllexport

文档评论(0)

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

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

1亿VIP精品文档

相关文档