本书向读者提供了IDL的详细描述及如何使用IDL方面的知识,基于示例、由浅入深地阐述了各种IDL构造,并提供了示例C++和VB代码。
本书分为两大部分,共10章。第一部分包括前6章,这部分完整地描述了IDL中的各种构造。同时还给出了随同客户调用序列以及方法实现。第二部分的4个章节则提供了一个IDL类型、修饰符、关键字及属性的参考。
本书适合使用COM、微软事务服务器(MTS)、C++或Visual Basic的COM十的开发者及接口设计人员阅读。
序
前言
第1章 IDL你好
1.1 什么是IDL?
1.2 定义接口
1.3 添加参数
1.4 有关方向属性的更多问题
1.5 小结
第2章 一个IDL文件的结构
2.1 接口和类型信息
2.2 库块内定义
2.3 编制类型库版本
2.4 生成C++类型信息
2.5 在库块外部定义
2.6 建立一个代理-存根DLL
2.7 接口定义.类型库和oleautomation属性
2.8 本地属性
2.9 引入其他文件
2.10 在库信息组中引入文件
2.11 Coclass
2.12 小结
第3章 数据类型和接口问题
3.1 基本数据类型
3.2 有符号(signed)和无符号(unsigned)数据类型
3.3 char和byte
3.4 char和wchar_t
3.5 比较LPOLESTR和BSTR
3.6 枚举类型
3.7 对象引用
3.8 结构
3.9 联合(Union)
3.10 变体数据类型(VARIANT)
3.11 typedef
3.12 属性
3.13 接口的继承性
3.14 调度(dispatch)接口
3.15 小结
第4章 指针和数组
4.1 指针基础知识
4.2 指针和常量
4.3 指针的语义
4.4 顶级(top-level)指针和嵌入(embedded)指针
4.5 指针和语言映射
4.6 对象引用和指针
4.7 数组
4.8 固定大小的数组
4.9 一致性数组
4.10 一致性指针
4.11 一致性指针作为输出参数
4.12 利用一致性模拟固定大小的数组
4.13 多维的一致性指针
4.15 锯齿状(Jagged)数组
4.16 安全数组(SAFEARRAY)
4.17 管理SAFEARRAY
4.18 小结
第5章 设置别名
5.1 方法别名
5.2 类型别名
5.3 更多的有关类型别名机制的问题
5.4 小结
第6章 异步COM
6.1 异步调用
6.2 客户端的异步性
6.3 服务器端的异步性
6.4 小结
第7章 IDL类型
第8章 IDL类型修饰符
第9章 IDL关键字
第10章 IDL属性
所有以组件对象模型(Component Object Model, COM)为工作对象的开发者都需要有关COM接口定义语言(Interface Definition Language, IDL)的知识.IDL是一门相当复杂而又神秘的语言, 所以获得有关知识也是一个颇为艰难的过程.本书就提供了IDL的详细描述以及如何使用IDL, 使它变得易于接受和理解.本书采用基于示例.由浅入深的阐述方式, 展现了各种各样的IDL构造(construct), 叙述了它们存在的原因, 具体是用来做什么的, 在接口设计中怎样使用它们以及什么时候使用它们.而且, 还提供了每一种情况下的IDL示例, 若该示例是可应用的, 还提供了C++和Visual Basic编写的客户端和COM对象的源代码.但是, 这些源代码示例并非用于剪切下来并粘贴到已存在的应用程序中去, 因为它们仅仅是被用来示例说明IDL的一些特殊点, 以及它们与客户端和COM对象的实现间基本关系.
这本书是有关COM IDL方面知识的书籍, 所以本书并没有涉及到IDL关键字.属性或者仅来自于标准远程过程调用(RPC)的有用的一些构造(construct).此外, IDL最重要的部分是它由COM截取层(interception layer)高效地执行数据列集, 本书的绝大多数讨论都是基于那些影响截取层性能的IDL构造的.那些对截取层没有影响的属性在绝大部分章节中被忽略.
这本书描述了大量的探索工作以及IDL提供的各种各样的功能的测试.某些情况下, 可能会与正式文献的一些信息有分歧.作者鼓励读者亲自就这些论断做一些测试来确认其正确性.作者所做的所有测试都是使用微软IDL(MIDL)5.03.0280版本的编译器实现的.早期的版本可能不支持本书中一些详细讨论的特性.
新版本的MIDL编译器即将出现, IDL自身也将演化发展.总有一天, 每个新版本都有新的IDL的现象会彻底消失, 但是开发者们依旧需要处理IDL允许他们描述的事情.考虑到它的通用性和适应性, 可扩展标志语言(eXtensibl Markup Language, XML)似乎是作为一门描述性语言的基础的很好选择.为了在将来的IDL领域中取得领先地位, 作者鼓励读者阅读有关XML计划的W3C工作草案以及描述简单对象访问协议(Simple Object Access Protocol)的W3C注释:
http://www.w3.org/TRxmlschema-0
http://www.w3.org/TR/xmlschema-1
http://www.w3.org/TR/xmlschema-2
http://www.w3.org/TR/soap.html
作者欢迎反馈, 任何问题.评论和纠正都可以通过e-mail发送到marting@develop.com.本书还有一个站点:http://www.develop.com/marting/essentialidl, 该站点是由作者维护的站点中有一个勘误表以及一些示例.
本书适用的读者群
这本书面向的读者群是使用COM.微软事务服务器(MTS). C++或者Visual Basic的COM十的开发者以及接口设计人员.它假定读者已经具备了一些有关COM的工作知识, 例如, Don Box编写的《Essential COM》中提到的知识或者Ted Pattison编写的《Programming Distributed Applications with COM+ and Microsoft Visual Basic 6.0》中提到的知识.
本书期望达到的目标
这本书被分成了两大部分.第一部分包括前六章, 这部分用带有主语.谓语以及形容词的完整的明确的句式描述了IDL中的各种构造.在给出IDL构造的同时, 还给出了随同客户调用序列以及方法实现.除第一章外, 每一章都有一个小结, 小结中列出了有关被讨论的IDL构造的使用方面的一些指导性建议.最后四个章节提供了一个IDL类型.修饰符.关键字以及属性的参考表.
第1章:IDL你好
许多COM开发者或者没有意识到IDL的存在, 或者不能确定IDL存在的必要性.那么, 第1章就描述了IDL的基础以及它存在的理由, 还顺带提供了有关接口定义的一些基础知识.
第2章:一个IDL文件的结构
MIDL编译器能够输出两种格式的类型信息.具体哪一种类型信息出现的频率高取决于一个给定的IDL构造在这个IDL文件中所处的位置.第2章涉及到生成类型信息的细节问题, 如何创建代理--存根(proxy-stub)DLL的问题, 如何创建本地和远程接口的问题以及如何创建各种文件管理构造的问题.
第3章:数据类型和接口问题
使用适当的数据类型是接口设计以及组件集成的关键问题.第3章涉及到处理基本数据类型的细节问题以及对象引用.用户定义的数据类型.枚举.结构以及联合等知识.本章还涉及到如何确保在任意生成的类型库中出现信息的正确性.这一章还讨论了接口继承性的问题.
第4章:指针和数组
许多接口需要能够支持输出参数, 还有一些接口需要支持数据数组.第4章涉及到对IDL中指针处理的细节问题, 其中包括IDL和COM截取层处理顶层和嵌入式指针的不同方式的问题.本章还涉及到了各种各样的数组类型, 其中包括固定长度的数组.一致性数组以及 SAFEARRY等等.
第5章:设置别名
IDL支持为方法以及类型设置别名, 接口设计者可以使用方法和类型的别名在COM截取层中插入任意代码.第5章详细地叙述了怎样使用这两种类型的别名, 其中包括进行别名命名的两种方法:[transmit_as]和[wire_marshal].
第6章:异步COM
Windows 2000支持来自于客户端和服务器端的异步COM调用.第6章详细地描述了支持这种调用的IDL属性, 同时详尽地编写了客户端和服务器端的代码.
第7章:IDL类型
IDL提供了某些内嵌的基本数据类型, 系统 IDL文件也提供了几种构造类型.第7章是所有基本的IDL和构造性的类型BSTR.SAFEARRAY.VARLANT和VARIENT_BOOL的一个参考.本章提供了一些相关的信息资料, 其中包括每种类型的大小.类型库的一些信息.每种数据类型的Oicf映射和 C++.Visual Basic的映射等等.
第8章:IDL类型修饰符
IDL允许类型被某些类型修饰符修饰, 这些类型修饰符包括const.signed.unsigned.第8章提供了所有IDL支持的修饰符的参考, 还包含一些其他信息, 例如:一个给定的修饰符在类型库中是否被描述, 类型修饰符可以修饰什么类型等.
第9章:IDL关键字
IDL提供了大量的关键字, 这些关键字有各种各样的用途, 包括定义接口.结构以及引入其他IDL文件等.第9章提供了从coclass到union的所有的IDL关键字的参考.其中描述信息包括代表关键字的类型描述信息的格式, 例如什么属性是强制的, 什么属性是任选的.
第10章:IDL属性
IDL的关键字和其他的构造可以用各种属性进行注释.第10章就提供了所有与列集和其他相关内容相关的IDL属性的一个参考.本章还包括一些其他信息, 例如:一个给定的属性在类型库中是否出现, 以及属性可以应用到的关键字和构造.
感谢
虽然这本书的作者只有一个, 但是, 以不同方式为这本书的诞生做出努力的却有很多人.首先主要的帮助来自于我的家庭, 衷心地感谢我的妻子——Hayley和我的两个儿子——Matthew和Samuel.谢谢他们给我时间和空间来完成这本书.我知道, 在写作这本书的过程中, 有许多困难的时刻, 是他们帮助了我, 所以我衷心地谢谢他们对我的帮助和理解.
在写作这本书的过程中, 还有大量的审核人员提供了许多有用的.有见地的.全面的反馈.他们包括:Daniel Sinclair.Dan Sullivan.Simon Horrell.Paul Hollingsworth.Steve Johnson.Naveen Thakur.Tim Ewald.Chris Sells.Don Box.Steve Rodgers和Bob Beauchemin.
特别感谢Don Box.Tim Ewald.Simon Horrell和 Keith Brown, 感谢他们为了讨论棘手的IDL问题而不厌其烦地与我通过电话.e-mail和面对面地交流.
也感谢http://disguss.microsoft.com上 DCOM和 ATL列表中的人们, 是他们提供了有关IDL细节问题的探讨.还要谢谢DevelopMentor的所有成员和领导, 谢谢他们给我创造了这么好的一个工作环境, 谢谢他们的帮助, 使得我有足够的时间来完成这本书.我还要谢谢Kristin Erickson, 她是我在Addison-Wesley的编辑, 谢谢她在我写作这本书的过程中提供的所有帮助以及对我的体谅, 知道何时与我谈问题, 何时让我一个人思考.要尤其感谢的是她对我不能在限期交工的容忍.也谢谢在Addison-Wesley的所有工作人员, 是他们将我的电子版书变为了印刷品, 他们是:Kristin Erickson.Marcy Barnes以及 Jacquelyn Doucette.
对于我而言, 写一本书是一种快乐和痛苦并存的奇特经历.我希望这本书带给读者的感受更多是前者, 而没有后者.
Martin Gudgin
Ashton Keynes, 英国
2000年8月
http://www.develop.com/marting