Windows 2000系统编程02.pdf
《Windows 2000系统编程02.pdf》由会员分享,可在线阅读,更多相关《Windows 2000系统编程02.pdf(76页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、下载第2章ActiveX 配套工具当我还是孩提时,经常要走好多的路。我生长在一个很小很小的小镇。我们住在离食品店不远的街区,于是一有空闲,就走着到食品店去买东西吃。我们常常走着去海边和学校。Bobbie Anne的面包店很顺路,我们回家时,买些热的油炸焦圈(或奶油牛角,或少量的奶油蛋糕)。后来,我开始骑自行车。骑着自行车,我们可以到更远的地方。图书馆是一个很好的去处。我甚至骑着自行车,外出好几天。我不是唯一有自行车的人。镇上几个老人都知道,谁骑车,谁走路。P e t e,一个退休的屠夫,就骑着一辆红色的自行车,绕着小镇骑行。人们都知道,身体已经垮了的退休律师,E d d i e也经常骑自行车,
2、绕着小镇骑行。还有坐在三轮车上的 M e l v i n。在飞机失事后,他就带着头盔、点着闪亮的灯,驱车而行。J e ff总是步行绕小镇而行,并且将一些坏消息告诉他的老伙伴。当然,也有许多象我一样的小朋友。当我移居到Te x a s的A u s t i n,我注意到一些事情都不固定。既没有人走路,也没有人到处骑车。的确,多数人走路或骑车,但他们并不总是如此。他们总是驱车去公园,而不是骑自行车,或者只绕一个圈,骑一会儿。那时,他们带上自行车,驱车出行,并伴着跑步的人们前进。我想,在那个小镇,人们不得不这样做。在纽约,人们走到 Hebrew National街区买热狗。而在洛杉矶,每个人都驾车出行
3、。休斯顿(我现在的故乡)也是一样,没有所谈及的公共交通,于是每个人都驱车出行。我已经加入到这些人群中。有很长时间,无论到何处,我都是徒步。我的儿子和我偶尔骑自行车到大门口附近的便利商店。如果天气很冷或很坏,我也知道驱车去邮局。编程在很多地方象这样。在过去的日子里,每个人都用穿孔卡(或用键控穿孔机打卡)。当然,小型机需要使用前面板的开关在一些引导程序代码。引导程序代码很多是从纸带装载到实装入器。于是实装入器从纸带读入你想要的东西。今天,谁还使用纸带?谁还记得穿孔纸带是什么?没有多少人会记得。既没有多少人会对穿孔卡或纸带的消失而忧伤,也没有人回想是谁预见过这些普遍存在的技术的最终让位?Wi n d
4、 o w s编程也不可避免这些影响。在一段时间内,所有的 Wi n d o w s编程人员都使用C语言和A P I(也称作 S D K)。于是,多数程序从 C中移植。许多使用 M F C(Microsoft FoudationC l a s s e s)移植到C+。其他则移植到更高水平的工具,如 Visual BASIC,也有移植到J a v a中。另外的移植在A P I级别发生。过去,当 M i c r o s o f t在Wi n d o w s引入新特性时,都将发布 A P I的文档,即一系列用于操作这些特性的系统级的命令。今天,来自M i c r o s o f t的多数新技术都不支持
5、传统的A P I。他们使用A c t i v e X取而代之。A c t i v e X是一个包罗万象的词,一直被用来描述 O L E和C O M的最终版本。Windows 2000将一些额外程序段加入到混合器,并将其全部命名为 C O M+。你感到困惑吗?马上就会明白。就象每一年,M i c r o s o f t改变有关这些技术的名字。通常,涉及传统技术,我使用术语A c t i v e X和C O M,而对于Wi n 2 0 0 0新增特性,则保留术语C O M+。第2章 ActiveX配套工具15下载是否想操作外壳联接?你将需要 A c t i v e X。是否想操作先进的 M A P
6、 I?你也需要 A c t i v e X。M i c r o s o f t的事务处理服务器呢?你还是需要 A c t i v e X。在本章,我们将学习本书其余部分使用到的 A c t i v e X。然而,A c t i v e X是一个很大很大的题目,并且贯穿全书(实际上,作者写过几本关于 A c t i v e X的不同的书)。因为A c t i v e X是那么多新技术的核心,无论如何,你都应当学习好 A c t i v e X,那么就从现在开始学习吧。如果你已经了解基本 A c t i v e X的概念,你也许想撇开本章。如果以前你实际上已经编写A c t i v e X的程序,
7、你大概想跳过本章,去阅读本书的其余部分。然而,如果你不熟悉A c t i v e X,我就建议你在阅读使用A c t i v e X的其他章节前,要仔细地阅读本章。你将度过美好的时光。2.1 ActiveX与J a v a许多编程人员都不想提供A c t i v e X,因为他们认为J a v a会替代A c t i v e X。这是一种相当于胡言乱语的争论驱使的舆论。A c t i v e X与J a v a的争论是We b浏览器(及需要J a v a小程序样式代码的其他软件)。即使J a v a完全替代We b浏览器及类似软件中的 A c t i v e X,也只是A c t i v e
8、X实现的操作中的一小部分。M i c r o s o f t明白地提交给A c t i v e X,且在A P I级别,无论什么A c t i v e X想要使用的就是你将要使用的。所以即使We b浏览器普遍包含J a v a,M i c r o s o f t也很有可能将A c t i v e X用于新的A P I。当你阅读本章时,你会注意到 A c t i v e X是一种关于许多应用的技术,只有很少情况才和 J a v a竞争。这些情况仅发生在高配置文件情况,并且接受所有的关注。所以A c t i v e X是Next Big Thing。你将怎样开始呢?你是否必须编写 O L E程序?
9、这是一个大问题。在你能够编写A c t i v e X服务器程序和客户程序之前,你需要了解其他几件事(像系统注册)。在大多数情况,你不必编写大多数人考虑的 O L E程序。传统的O L E程序设计能够使你将一个文档嵌入或链接到另一个文档。这是一个复杂的过程,它包括许多不同的 A c t i v e X对象。然而,编写普通的A c t i v e X组件一点也不困难。2.2 定义关于A c t i v e X的令人感到灰心的一件事是有许多不熟悉的词汇,似乎一周接一周地改变。现在,我们来定义这些术语:ActiveX Component 其他程序能够使用的A c t i v e X对象。Active
10、X Control工作象一个控制窗口的特殊组件。ActiveX Client使用任一A c t i v e X组件的程序。ActiveX Container能够接受A c t i v e X文档对象或控制的程序。ActiveX Server提供一个或多个A c t i v e X对象的D L L或可执行程序。ActiveX Document Object你能够嵌入或链接到容器(container)的文档(这是传统的O L E函数符)。当前,M i c r o s o f t将任一 A c t i v e X对象称作一个控件。我想这不是好主意。我宁愿称呼A c t i v e X对象为组件。一些
11、组件知道怎样像传统的窗口一样起作用,这就是控件。例如,将名字变换为因特网地址的A c t i v e X对象就是一个组件。你不能够将它拖曳到 Visual Basic窗体上。另一方面,构成屏幕上旋转图标的控件既是一个组件又是一个控件。控件类似于老式样的O L E控制扩展名(OLE Control Extension,OCX)或Visual Basic 扩展名(Visual Basic Extension,VBX )的控制。2.3 ActiveX对象的结构这里有本章中大多数令人吃惊的和重要的语句。对于一个客户程序,A c t i v e X对象不比函数指针表更多。就是这句话,请再读一遍。当一个客
12、户访问一个对象时,就使用表中指针来简单地调用函数(见图 2-1)。对象能够支持用于不同目的的任何数量的表,但客户一次只能支持一个表。这些表被称作界面(i n t e r f a c e)。当然,客户和服务器必须完全同意这些函数的次序和形式。调用的约定、参数、及返回值必须使两边的期望值匹配。图2-1 界面表考虑这个例子:你在编写一个系统,它使用户能够检索股票市场的数据。你创建一个带有函数的A c t i v e X对象,这些函数要确认用户的有效 I D,在用户的账户上建立一个输入(于是你能够因为事务而向他收费),并且得到数据。于是对象有三个函数L o g I n、A c c o u n t L
13、o g和G e t S t o c k D a t a。你可以使用两个界面表,它们用作登录和记账(I L o g界面);另一个用作数据的检索(I G e t S t o c k I n f o,见图2-2)。能不能使用单个的表?是的,能够。然而,要考虑另外的例子。股票市场数据程序是成功的,也将其应用于为互助资金提供数据。你可以创建图 2-3中的对象。注意两个函数是相同的,它们外观和图 2-2有相同的界面。只有 G e t S t o c k D a t a函数改变了。请记住这个例子。本章后面,将更多地考虑它。顺便提一句,习惯上(虽然不是强制的)用字母I作为界面名字的第一个字母,如I G e t
14、 S t o c k I n f o和I L o g。你使用什么语言来创建对象是没有关系的。可以使用 C、C+、D e l p h i或Visual Basic。唯一重要的是所使用的语言能够创建函数指针的魔方表。A c t i v e X服务器程序能够驻留在 D L L或E X E文件中,并且将对象提供给其他程序。你使用什么语言编写客户程序或服务器程序,都没有关16Windows 2000系统编程下载指向函数#1的指针指向函数#2的指针指向函数#3的指针指向函数#4的指针对象客户客户代码服务器函数#1第2章 ActiveX配套工具17下载系,只要它能支持A c t i v e X就使用你最喜欢
15、的。图2-2 股票市场对象图2-3 互助资金对象2.4 对象似乎很简单,是不是?(真的,只多一点,但不很多。)如果你熟悉C+中的对象,似乎不是这么一回事。是的,并不严格相同,但如果你仔细观察,就会发现 A c t i v e X对象允许如同C+对象一样的基本操作。如下原因,表明对象是重要的:对象掩饰了函数的执行。你要求对象执行某功能,对象照样做了。但你并不知道它是怎样做的。这就是封装,能够进行对象操作方面的多数改变,而不影响任何其他代码。对象能够重用它们的代码,构造其他对象。在 C+中,通过派生实现这些。当从其他类派生出一个类时,所派生的类就继承了全部基类代码。对象是多形态的。例如,如果有一个
16、车辆的基对象,你就能够为小汽车、卡车和带蓬货车创建更详尽的类。多形态性使你能够将小汽车、卡车和带蓬货车视为车辆。换句话,你能对象对象LoginILogIGetStockInfoAccountLogGetStockDataILogIGetMutuallnfoLoginAccountLogGetMutualData18Windows 2000系统编程下载够定义一个车辆的表格,可以包括小汽车、卡车和带蓬货车,而勿需知道是哪个。C+也是通过派生处理它们的。如果所有三个类都是从车辆类派生的,你就能够在车辆指针中存储指向它们的指针。A c t i v e X怎样完成这些目标呢?封装是容易的,因为每个 A
17、c t i v e X对象揭示了界面(且没有别的),在这些界面中,客户程序必须通过指针调用。你能以任何方式自由改变对象,只要界面表包含以原先方式工作的指针。如果你同意界面表中的位置 4打印三个整型变量,那么这就是必须做的。然而,怎样做才更适合你。你能够用 C+或Visual Basic编写对象,或者你通过 I n t e r n e t连接到主机,并且使用F O RT R A N打印之。客户程序不知道或不在意。还有遗留的派生问题,对吗?不准确,C+用派生来支持代码的重用和多形态性。派生对于对象的定位来说,尤其不重要它是简单的方法,以满足代码重用和多形态性的目标。A c t i v e X使用不
18、同的机制提供这些特性。2.5 代码的重用有两种方法,A c t i v e X组件能够重用其他 A c t i v e X组件:封锁和聚集。聚集需要许多操作和设计,我们将在稍后讨论。另一方面,封锁是相当简单的。在执行中,一个 A c t i v e X对象不能使用另外的A c t i v e X对象是毫无理由的。由于封装,对象的用户不知道或不在意实际工作是什么,这就是封锁。新的对象能够提供与基对象及附加的界面一样的界面。当对象接收到对一个被包含的界面的调用时,就能做以下任一件事:处理本身的调用(这类似于一个C+的覆盖)。调用包容对象(这类似于C+中的什么也不做)。执行一些代码、调用包容对象、或
19、许执行一些更多的代码(这类似于 C+调用它们的基类的覆盖)。这使你能够重用许多其他 A c t i v e X组件,为C+派生类重用它的基类的相同方式。考虑这种方法的优点如下:图2-4 对象的封锁界面界面界面对象对象第2章 ActiveX配套工具19下载 对于基类,则不需要源代码。基类甚至不一定使用相同的语言。如果基类改变,包容类将自动地使用新版本而不用重编译。你不必揭示一个对象支持的所有界面,这允许有选择地揭示基类的界面。因为A c t i v e X组件只揭示界面函数(而不是变量),则没有在C+中遇到的问题,其间派生类依赖于一些基类的内部状态。只有被允许的通信经过这些界面。图2-4表示了一
20、个包容对象的例子。注意外部的客户程序没有包容类所具有的概念。如果对象稍后决定使用不同的对象,以提供一个界面,或提供内部的整个界面,那就自由地去做。如果对象需要继承多个基类,它能够简单地包含多个对象。2.6 多态性由于对象能够支持多界面,它们可能是多态的。再说车辆/小汽车/卡车/带蓬货车的例子,参考图2-5。这三个对象是多态的,因为它们都支持I Ve h i c l e界面。通过向它们的 I Ve h i c l e界面表提出请求,客户程序能够将所有这些对象视为一样的。如果客户程序需要更多的细节,也能够得到更多的特殊的界面表。注意,如果有一个车辆的对象,则其他对象将通过包容器重用之。这里,唯一的
21、问题是何时将车辆类抽象化。在C+中,抽象的基类是不能创建的基类,而只能从中派生。如果你打算通过封锁重用 A c t i v e X对象,那么“派生”类就必须创建对象。因此,任何其他程序也能够创建对象。对这个问题,有几个特别的解决方案。例如,如果你没有告诉客户关于车辆类的事,他们就不能创建之。然而,没有非常好的答案。通常,在A c t i v e X中的抽象化的基类的概念就是:一个思想。多态性的方法有许多优点(一些有点类似于封锁的优点):你能够创建不相关的对象,它们相互间是多态的。对象不一定是用相同的语言表示的,故你不需要其他对象的源代码。任何程序能够与多态的对象一起工作,而不管程序的语言或来源
22、。多态性的另外的例子出现在股票市场/互助资金图2-5 多态对象汽车对象卡车对象蓬车对象20Windows 2000系统编程下载的例子中(参考图2-2和2-3)。这里,涉及登录到用户和计算费用的部分代码不一定改变。不去管使用中的对象,界面仍保持相同。只是数据界面是特殊的。如果稍后你想要另一个对象具有更复杂的数据界面,那怎么办?登录界面仍保持恒定。2.7 几个其他的A c t i v e X特性在你开始探索 A c t i v e X之前,有几个应当知道的其他特性。它们不是特别重要,但它们对A c t i v e X是特殊的。2.7.1 HRESULT和S C O D E习惯上,许多A c t i
23、 v e X函数返回一个被称作 H R E S U LT的类型。这是简单的 3 2位的值,它指明成功或失败,连同每种情况的说明(见图 2-6)。最高位指明错误状态。紧接着的 1 5位标识系统成功或失败(程序代码由M i c r o s o f t定义)。最后1 6位代码告诉你更多的信息。在3 2位的平台中,H R E S U LT和S C O D E是一样的。图2-6 HRESULTH R E S U LT几乎不为零,甚至在成功的时候,所以你不能只测试它是零或不是零。当你能够手控地将字段分开并测试它们的时候,通常更容易地使用 S U C C E E D E D和FA I L E D宏,以测试成
24、功或失败。A c t i v e X头定义了许多可以返回到 H R E S U LT的代码。例如,你可以返回 S _ O K以指明成功,或E _ FA I L以指明失败。其他的代码更特殊,例如,E _ O U TO F M E M O RY,E _ N O T I M P L或S _ FA L S E指明特殊的失败。这个最后的代码意味着函数成功了,但回答却是 FA L S E(无论对于特殊的函数意味着什么)。注意不是所有的A c t i v e X函数都返回H R E S U LT它们能够返回你想要的任何类型。然而,如果函数工作在进程边界(或在网络上),他们必须返回 H R E S U LT。
25、当H R E S U LT指明失败时,你不能假设关于任何输出参数的状态的任何事。要成功的函数必须部分地返回一些成功的H R E S U LT。2.7.2 GUID/UUID/IID关于A c t i v e X的令人畏缩的问题之一是唯一地识别 I n t e r n e t网上的特殊的组件。只要有连网的预留错误代码E-设置结果是否错FA C-代码表明子系统产生错误错误代码-特殊的错误代码考虑,这个问题就会出现。开放软件基金会(Open Software Foundation,OSF)的分布式计算工作平台(Distributed Computing Environment)定义了全球唯一标识符(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Windows 2000系统编程02 2000 系统 编程 02
限制150内