本书的结构安排合理。它按不同主题逐步深入地探讨了在COM开发中可能遇到的高级问题。全书涉及了C++到COM的转换接口、安全、单元、实现以及事务等多方面的具体内容。针对每一方面,本书都提供了一些详尽实用的指导原则。它不但考虑了C++的开发人员,而且也兼顾了其他语言的开发人员。相信各层次开发人员在阅读本书之后,在COM的开发方面都会受益匪浅。
译者序\r\n前言\r\n第1章 从C++转变到COM\r\n 实践1 在定义类之前定义接口(用IDL实现)\r\n 实践2 设计时牢记分布式的概念\r\n 实践3 对象不应该有自己的用户界面\r\n 实践4 当心COM单实例\r\n 实践5不要允许C++的异常跨越方法边界\r\n第2章 接口\r\n 实践6 接口是语法和松散的语义,二者都是不可变的\r\n 实践7 避免E_NOTIMPL\r\n 实践8 要类型化的数据,不要模糊的数据\r\n 实践9 避免连接点\r\n 实践10 不要为单个对象的同一接口提供多个实现\r\n 实践11 无类型语言失去了COM的优点\r\n 实践12 双接口是很苛刻的,不要强求人们去实现它\r\n 实践13 选择合适的数组类型(不要使用开放的和可变的数组)\r\n 实践14 避免将Iunknown作为一个静态类型化的对象引用(使用iid_is)传递\r\n 实践15 避免包含指针的[in,out]参数\r\n 实践16 注意循环引用(以及它们可能造成的问题)\r\n 实践17 避免使用wire_marshal,transmit_as,call_us以及cpp_quote\r\n第3章 实现\r\n 实践18 防御性编码\r\n 实践19 总是初始化[out]参数\r\n 实践20 不要使用还没有被AddRef的接口指针\r\n 实践21 在桥接COM类型系统和C++类型系统时使用staatic_cast \r\n 实践22 智能指针带来的复杂性至少和它们消除的复杂性一样多\r\n 实践23 不要手工优化引用计数\r\n 实践24 使用延迟求值实现枚举器\r\n 实践25 适当地使用flyweight\r\n 实践26 避免跨单元边界使用tearoff\r\n 实践27 要特别地小心使用BSTR\r\n 实践28 COM聚合和包容只是一种身份诡计,而不是代码重用\r\n第4章 单元\r\n 实践29 不要跨单元边界访问原始接口指针\r\n 实践30 当在MTA线程之间传递接口指针时,使用AddRef\r\n 实践31 用户界面线程和对象必须在单线程单元(STA)中运行\r\n 实践32 避免从进程内服务器创建线程\r\n 实践33 小心FTM\r\n 实践34 当心MTA中的物理锁\r\n 实践35 STA可能也需要锁\r\n 实践36 避免扩展进程内对象上的现存列集\r\n 实践37 当你提前退出时,请使用CoDisconnectObject来通知存根\r\n第5章 安全\r\n 实践38 CoInitializeSecurity是你的朋友,要学习它、爱他、调用它\r\n 实践39 避免以激活者方式激活\r\n 实践40 避免伪装\r\n 实践41 使用细粒度验证\r\n 实践42 使用细粒度访问控制\r\n第6章 事务\r\n 实践43 使事务尽可能短\r\n 实践44 当分发自己的对象的指针时总是使用Saferef\r\n 实践45 不要跨活动边界共享对象引用\r\n 实践46 小心从事务层次的中间公开对象引用\r\n 实践47 小心隐式地提交事务\r\n 实践48 在适当的时候使用非事务对象\r\n 实践49 把重要的初始化移到IobjectControl::Activate\r\n 实践50 不要依赖JIT激活和ASAP停用来实现可伸缩性\r\n结束语\r\n关于作者\r\n索引
COM是一种开发软件组件的方法. Microsoft的许多技术, 如ActiveX. DirectX. OLE以及. NET平台的核心, 都是基于COM建立起来的:同时, Microsoft也大量地使用COM组件来编写他们的应用程序和操作系统. COM所蕴含的概念并不只是在Windows操作系统下才有效——COM并非一个大的API. 实际上, 它所代表的面向组件编程与结构化编程及面向对象编程一样, 也是一种编程方法, 而且有望成为未来的主流. 在任何一种操作系统中, 开发人员均可以遵循“COM方法”. 可以预见, COM的应用将会日益广泛. 因此, 对开发人员而言, 掌握COM技术就显得尤为重要了.
本书由著名的COM大师DonBox及其合作者一起编写, 是AddisonWesley出版社名声显赫的. 由ScottMeyer开创的”“Effective系列”图书中的重要一员. 他们对COM的背景和技术内核有着极为深刻的理解. 有关COM的基础教程, 一般来说, 只是单纯地介绍一些基本的理论和技巧, 而本书面向的则是高层次的COM开发人员. 作者从不同角度引导我们解决COM开发中最常见的一些高深疑难问题, 而这些问题的解决, 对应用程序的正常运行起着至关重要的作用. 为了让我们可以更加高效地运用COM, 本书还提供了具体的指导原则和详尽准确的示例程序. 尤为可贵的是, 作者把自己在COM领域中多年的研究成果无私地奉献给了读者.
本书的结构安排合理. 它按不同主题逐步深入地探讨了在COM开发中可能遇到的高级问题. 全书涉及了C++到COM的转换接口. 安全. 单元. 实现以及事务等多方面的具体内容. 针对每一方面, 本书都提供了一些详尽实用的指导原则. 它不但考虑了C++的开发人员, 而且也兼顾了其他语言的开发人员. 相信各层次开发人员在阅读本书之后, 在COM的开发方面都会受益匪浅.
COM技术向来以难于掌握著称, 而本书更是众多COM书籍中较深的一部. 如果读者需要了解COM的基本知识和理论, 建议循序阅读中国电力出版社出版的《DCOM入门》和《COM本质论》.
由于时间仓促, 加之译者对COM的认识和理解程度有限, 译文难免有不妥之处, 恳请读者批评指正.
译 者
2003年
COM(组件对象模型, Component ObjectModel)与C++在很多方面是并行发展的. 二者的发展都是为了一个共同的目标, 即通过对现有编程模型的改进来更好地实现对象重用性和模块性. 就C++而言, 其先前的模型是C语言的过程型程序设计, C++增加了对基于类的面向对象程序设计的支持. 而就COM来说, 它以前的模型是C++中基于类的编程模型, COM增加了对基于接口, (interface-based)的面向对象程序设计的支持.
随着C++什的发展, 有关它的经典著作也越来越多. 在这些经典著作之中, 引人注目的一本是Scott Meyer撰写的《Effective C++》. 这本书可能是第一本不以教授读者C++基本技巧和语法为目的的书. 该书针对的是一线的C++程序员, 并且提供了50条所有C++开发人员在创建基于C++的系统时都应遵从的具体规则. 该书的成功一方面因为在此领域有大量应用此种技术工作的开发人员, 另一方面也是因为有大量相关经典著作可以借鉴.
在该书最初出版时, 虽有其他很多介绍性的文章, 但是提供帮助的主要是Stroustrup的《The C++ProgrammingLanguage》以及Lippman的《The C++ Primer》.
COM编程的发展已经到达了发生重要转变的临界点. 虽然微软及其他开发公司大量地采用COM, COM开发人员的数目还是增长缓慢, 但是, 可以肯定的是, 这个数目正逐步接近Windows开发人员的数目. 同时, 在COM发布5年后, 终于有了足够详细的规范, 以此为基础可以撰写更高级的书了. 这里, 谨以本书向Scott Meyer致敬, 为他创造性的工作, 为他的伟大尝试——提供了一本如此大众化的书, 使得大多数开发人员都可以很容易地找到通用设计和编码问题的解决方案.
实际上, 现有的COM图书基本上都假设读者不懂COM知识, 把大部分精力都集中在基础教学上. 本书试图提供一本超越COM基本技巧和理论的指南, 填补当前COM规范的空白. 这些具体的指导原则基于作者使用COM的实际工作经验, 来源于作者最近4年来对成千上万COM开发人员的培训心得, 同时还来源于各种基于Internet论坛上的大众智慧. 其中最重要的论坛是在DCOM-request@discuss. microsoft. com上的DCOM邮件列表.
有很多人在本书的编写过程中提供了宝贵的建议, 他们是Saji Abraham. David Chappell. Steve DeLassus. Richard Grimes. Martin Gudgin. Davide Marcato. Ted Neff. MikeNelson. PeterPartch. Wilf Russell. Ranjiv Sharma. GeorgeShepherd以及JamesSievert. 特别感谢George Reilly, 他以超强的编辑能力改正了作者写作中的错误. 任何其余的错误都是作者的责任. 你可以通过给Effectiveerrata@develop. com发送Email来让我们知道这些错误. 任何勘误或更新都将被发布在本书的主页上:http://www. develop. com/effectivecom.
本书所提供的有些原则与一般看法或者微软的官方文档不符, 这个事实可能会令读者感到迷惑. 但我们鼓励你不带偏颇地尝试我们的观点, 然后告诉我们你的发现. 你可以通过发送E-mail给effectivecom@develop. com与本书的作者联系.
读者对象
本书适合使用COM和MTS的软件开发人员阅读. 它既不是一本教程, 也不是入门级读物, 而是假设读者有一定的COM编程经验, 并且正为分布式对象计算的复杂性和广泛性而烦恼. 与《Essential COM》一书中描述的一样, 本书假定读者熟悉COM的工作术语. 本书主要是为C++程序员而作, 然而, 很多主题(如, 接口设计. 安全. 事务)也可供VisualBasic. Java以及ObjectPascal的开发人员参考.
本书内容
本书分为6章. 除了第1章介绍“100%纯”C++与COM的文化差异外, 其他各章都
介绍COM的核心元素之一.
第1章 从C++转变到COM
C++开发人员在使用COM工作时具有最大的灵活性. 然而, 正是这些开发人员必须进行调整以适应基于COM的开发. 该章提供的5条具体指导原则, 使得从纯C++到基于COM开发的转变成为可能. 关于COM/C++方面的讨论包括异常处理. 单实例(singleton)以及基于接口的编程.
第2章 接口
COM开发最基本的组成部分是接口. 设计良好的接口将有助于提高系统效率和可用性, 而设计糟糕的接口将使系统脆弱并难以使用. 该章提供了12条具体的指导原则来帮助COM开发人员设计高效. 正确并易于使用的接口. 关于接口方面的讨论包括往返优化. 语义纠正以及一些常见的设计缺陷.
第3章 实现
不管用来设计COM组件的框架以及类库是什么, 在C++中编写COM代码更需要理解细节. 该章提供11条具体指导原则来帮助开发人员编写出高效. 正确以及可维护的代码. 关于COM实现方面的讨论包括引用计数. 内存优化以及类型系统错误.
第4章 单元
COM最复杂的内容之一就是单元(apartment)的概念. 单元在COM中用于建立并发模型, 在很多操作系统和语言里都没有类似的概念. 该章提供了9条具体的指导原则, 帮助开发人员确保他们的对象在多线程环境里能够运行正常. 关于单元方面的讨论包括真实锁定管理. 常见列集(marshal)错误以及生存期管理.
第5章 安全
在COM里面存在少数几个比单元更加令人生畏的领域, 其中之一就是安全. 这是因为很多开发人员天生对安全厌恶:另一部分原因在于那些相当神秘而又不完整的文档困扰着COM接口的安全性. 该章提供了5条具体的指导原则来帮助开发人员掌握COM领域的安全解决方案. 关于安全方面的讨论包括访问控制. 验证和授权.
第6章 事务
许多出版物都使用大量篇幅讨论MTS(微软事务服务器, Microsoft Transaction Server), 但却很少讨论关于MTS所隐含的新的事务编程模型的问题. 该章提供了8条具体的指导原则, 帮助开发人员建立基于MTS的更有效. 可扩展和正确的系统. 讨论的主题包括截取的重要性. 基于活动的并发管理, 以及将即时激活作为增强可伸缩性的基本机制的危险性.
致谢
首先, 同时也是最重要的, Chris要感谢他的妻子Melissa. 他的各种活动, 包括本书的编写, Melissa都给予了很多支持.
其次, 感谢J. CarterShankin及AddisonWesley公司的工作人员为我提供了理想的写作环境.
感谢所有的审校者为本书提供深思熟虑的反馈意见.
感谢我所有的学生以及对DCOM和ATL邮件列表有贡献的成员. 本书中所有的真知灼见都来自于大家围绕COM互相讨论的问题.
最后, 但可不是最不重要的, 感谢我的合作者. 在这个项目中, 他们自始至终都在勤奋地工作. 能够和他们一起工作, 我倍感荣幸.
Don希望感谢其他3个同伴, 因为正是他们丰富了他COM以外的生活方式.
感谢我的合作者(这些饥饿的工作狂们)与我分担压力并耐心地等待我完成自己杂乱的那一部分.
非常感谢ScoRMeyers允许我们采用”他那种取得巨大成功的写作格式, 他将这种格式应用到自己终身为之奋斗的一门技术中.
感谢我在DevelopMentor的所有同事. 感谢他们在我还拖延了另一本图书写作项目的同时, 能够忍受另外6个月的延迟.
感谢AddisonWesley的J. CarterShanklin, 是他创造了一个舒适的工作环境.
感谢那些曾参与这个漫长而有趣话题的众多DCOM列表成员. 本书在各方面都是对工作在COM最前线的编程人员提出的安全漏洞. MTS技术内幕以及IDL挑战性难题的总结.
特别感谢多年以来在COM和VisualC++方面一直提供支持的微软工作人员.
Keith希望感谢他的家庭能够忍受他工作的日日夜夜, 是他们给他的生活带来了无穷的乐趣.
感谢Don. Tim. Chris能想到我并且邀请我参加这个重要项目.
感谢DevelopMentor的MikeAbercrombie和DonBox营造了一种独立思考的氛围以及一种建立在诚实和团队协作基础上的业务模式.
感谢那些在DCOM邮件列表中参与讨论这些总是很长的话题的人. 在COM开发人员之间建立文化氛围这点上, 这个邮件列表起着令人难以置信的作用. 很多丰富的想法从这个文化氛围中涌现了出来, 并被写入本书.
感谢Saji Abraham以及MikeNelson对COM社区所做的贡献.
感谢Carter, 如果你给我们指定本书的最后截稿期限, 那么这本书可能会差得多.
最后, 感谢所有参与我的COM和安全课程的学生们. 你们的评论. 问题以及挑战始终驱使着我为进一步揭开真相而努力.
首先, 也是最重要的, Tim希望感谢他的合作者承担了这个项目并且坚持将它完成. 与以前一样, 先生们, 这是一件很愉快的事.
同时, 感谢我的朋友和同事AlanEwald. OwenTallman. FredTibbitts. PaulRielly以及DevelopMentor的所有同事. 学生, 还有倾听我关于COM进展的DCOM邮件列表的参与者——感谢他们在必要的时候给予的明智的赞许和嬉笑怒骂.
特别感谢Mike. Don以及Lorrie经历了DevelopMentor早期的磨难, 而最终出现了一种杰出的思考环境.
当然, 还要感谢我的家人——Sarah让我戴上了COM的光环, Steve和Kristin提醒我成功的真谛, Alan和Chris不厌其烦地回答我的问题, Nikke和Stephen Downes-Martin替我接听来自各地的电话.
最后, 感谢工CartterShanklin以及AddisonWesley公司给我们充足的自由.
ChrisSells
俄勒冈州波特兰
1998年8月
http://www,sellsbrothers. com
DonBox
加州RedondoBeach
1998年8月
http://www.develop. com/dbox
KeithBrown
加州RollingHillsEstates
1998年8月
http://www. develop. com/kbrown
TimEwald
新罕布什尔州Nashua
1998年8月
http://www.develop. com/tjewald