Delphi 6常用COM组件速查手册

附录

COM(Component Object Model,即组件对象模型)是微软公司为使软件开发趋于人性化而开发的一种新技术,该技术在Windows平台上已得到日益广泛的应用,并逐渐成为建立组件及通过组件建立应用程序的规范。在COM构架下,开发者可编制各类功能专一的组件,然后将其按需组合,构成复杂的应用系统。

一、COM基础

1.什么是COM

COM是开发软件组件的一种方法。组件是一些小规模的二进制可执行程序,为应用程序、操作系统及其他组件提供服务。多个COM对象可连接并形成应用程序或组件系统。组件在运行期可不被重新链接或编译而进行卸载或替换。COM同时也是一个建立动态组件的规范,COM规范是一套为组件架构设置标准的文档规范。COM的发布形式一般为Win32动态链接库(DLL)或可执行文件(EXE)。
COM组件采用动态链接的方法调用且完全和开发语言无关,同时COM组件可借助二进制的形式发布,并可在不影响使用的情况下升级为新版本。
为实现组件的动态装入和卸载,所有的组件必须满足:
(1)组件必须动态链接,这是重要的要求。
(2)组件必须隐藏或封装其内部实现细节,这是动态链接的必要条件。
微软推出Windows 98系统后,整个操作系统的核心均围绕COM建立,因此可将Windows系统看作一系列的COM接口,在需要时调用这些接口的相应功能即可。

2.COM术语

(1)接口:是包含函数指针数组的内存结构。每个数组元素包含一个由组件所实现的函数地址。COM接口即为该内存结构。对于客户程序,组件是接口集,可通过接口访问COM组件。
(2)创建:组件的本质为DLL中实现的接口集。在客户获取某个组件接口指针前,需要先将相应的DLL装载至其进程空间中,并创建该组件。
(3)复用:COM组件可被复用,并支持接口继承。该继承指一个类继承其基类的类型或接口。在COM中可用包容和聚合来对组件进行改造。其中:
包容:包容在接口级完成。外部组件包含指向内部接口的指针,也可通过将调用转发至内部组件的方法来重现内部组件所支持的某个接口,且外部组件还可在内部组件中添加代码,并对接口进行改造。
聚合:聚合是包含的一种变化形式。当外部组件聚合某个内部组件的接口时,其并未重现该接口并将调用请求转发至内部组件。使用该方法,外部组件将无需重现并转发接口中的所有函数。

3.常用COM组件

Windows系统提供的常用COM组件包括FSO、WSH、ADO和XML组件,此外很多常用软件也提供COM接口,如Office、IE、FlashGet和NetAnt等。

二、COM组件的基本使用方法

在Delphi 6中调用COM组件首先必须在“Uses” 单元中声明对COM组件的应用,代码如下;
Uses Comobj;
一般使用Variant型变量来获取创建的COM组件句柄,因此还需声明对Variants单元的引用,代码如下:
Uses Variants;
声明相关的单元引用后,在Delphi 6中可通过CreateOleObject函数来创建COM组件的实例,该函数的语法和说明如下:
语法:
function CreateOleObject(const ClassName: string): IDispatch;
说明:
该函数用于创建COM组件的实例,其中ClassName为字符型参数,代表需创建的类名,即该COM组件的Class ID(CLSID)。每次调用CreateOleObject后,均会创建一个对象新实例并返回对该COM组件的接口引用,开发者可通过该接口来控制COM组件并调用组件提供的方法和属性。
如开发者将通过CreateOleObject函数创建的COM组件实例赋予一个Variant型变量, 那么可通过将该Variant型变量赋予Unassigned常量值来释放该COM组件实例。
综上所述,在Delphi 6中使用COM组件的基本步骤如下:
(1)声明相关单元的引用(Comobj和Variants单元)。
(2)创建Variant型变量。
(3)通过CreateOleObject函数创建COM组件实例并将其赋予Variant型变量。
(4)通过接口,控制COM组件实例进行相关操作。
(5)完成操作后,将Variant型变量赋予Unassigned常量,释放COM组件实例。

三、Delphi 6中常用的COM组件

(一)FSO和WSH组件

1.组件基础应用
FSO(File System Object),即文件系统组件对象,该组件可实现对驱动器、文件夹和文件的各种操作,如创建、修改、移动和删除或检测是否存在等。FSO对象模型还可获取关于驱动器、文件夹和文件的各类信息,如名称、创建日期和最近修改日期等。通过使用FSO 组件对象,可使对文件系统的操作变得非常简单。
FSO组件对象在Delphi中的调用语法如下所示:
fso:= CreateOLEObject(′Scripting.FileSystemObject′);
FSO组件包括的对象如下表所示:
(图1)

图1
图1

WSH(Windows Script Host),即脚本宿主组件对象,该组件封装大量的系统操作API函数,使对Windows的操作变得非常方便,可实现如网络信息和环境变量获取、执行应用程序、创建快捷方式、访问特定目录等操作。WSH组件包括的对象如下表所示:
(图2)
图2
图2

2.组件相关对象

(1)FSO组件相关对象:
Drive对象:
(图3)

图3
图3

File对象:
(图4)
图4
图4

Folder对象:
(图5)
图5
图5

TextStream对象:
(图6)
图6
图6

(2)WSH组件相关对象:
WScript对象:
(图7)
图7
图7

WshEnvironment对象:
(图8)
图8
图8

WshNetwork对象:
(图9)
图9
图9

WshShell对象:
(图10)
图10
图10

WshShortcut对象:
(图11)
图11
图11

(二)ADO组件

ADO(ActiveX Data Objects),即ActiveX数据对象组件,该组件是广泛使用的数据库连接组件,通过该组件可使客户端程序访问和操作数据库。使用ADO组件最主要的优点在于易用、速度快、内存占用小。

1.组件对象

ADO组件包括的对象如下表所示:
(图12)

图12
图12

2.组件相关对象

(1)ADO组件相关对象:
Connection对象:
(图13)

图13
图13

Recordset对象:
(图14)
图14
图14

Field对象:
(图15)
图15
图15

Command对象:
(图16)
图16
图16

(三)Office系列组件

Office系列中的很多软件(如Word、Excel、PowerPoint、Access和Outlook等)均提供COM接口,通过对该接口的访问,可在应用程序中生成各类Office文件,大大提高工作效率。
1.Word组件
(图17)

图17
图17

2.Excel组件
(图18)
图18
图18

3.PowerPoint组件
(图19)
图19
图19

4.Access组件
(图20)
图20
图20

5.Outlook组件
(图21)
图21
图21

(四)浏览器及相关组件

很多网络软件,如IE、FlashGet和NetAnt均提供COM接口,利用这些接口,可控制网络软件实现浏览、下载等功能。这些组件包含的常用对象如下所述:
1.组件对象
(1)IE组件:
(图22)

图22
图22

(2)网络快车组件:
(图23)
图23
图23

(3)网络蚂蚁组件:
(图24)
图24
图24

2.组件相关对象

(1)网际快车组件相关对象:
Netscape对象:
(图25)

图25
图25

(2)网络蚂蚁组件相关对象:
API对象:
(图26)
图26
图26

(3)IE浏览器组件相关对象:
Applicationm对象:
(图27)
图27
图27

(五)XML组件

XML(可扩展标记语言)以其可自定义标记的特点逐渐成为描述各类信息的主流语言。XML文件的插入、修改、检索等操作工作均可通过微软提供的XML组件对象来实现。使用XML组件可通过DOM和SAX二种方式对XML文件进行操作,且易用、速度快、占用内存小。
1.XML组件
(图28)

图28
图28

2.组件相关对象

(1)XML组件相关对象
XMLDOM对象:
(图29)

图29
图29

四、简单COM组件开发

(一)创建COM组件的步骤

1.COM组件的形式
常用的COM组件包括三种形式:
(1)以DLL文件形式提供,该服务程序被调用时,嵌入调用程序的线程中运行。
(2)以EXE文件形式提供,该服务程序被调用时,占用独立的线程运行。
(3)在远端机上以EXE文件形式提供,通过网络被调用并在远端机器上运行,运行结果通过网络返回。
这里我们将介绍采用第一种形式建立COM组件的过程,这也是最常用的形式。
2.COM组件的创建步骤
在Delphi6中创建COM组件的步骤如下:
(1)创建动态连接库。
(2)建立COM接口对象。
(3)编辑相应接口对象的属性和方法。
(4)实现COM接口中的属性和方法。
(5)注册并调用、调试。

(二)示例COM的设计

本例将引导读者开发一个简单的COM组件。该COM组件用于计算汉字的区位码,由于区位码计算在Windows和网络开发中均会使用,因此该组件应提供无界面直接输出和窗体界面计算二个大类。对于无界面直接输出类,应可接受用户输入的汉字,并可输出版权信息等,因此需设计二个方法。对于窗体界面计算,应可通过相应方法启动窗体界面。
初步设计后的区位码计算类的结构如下:
(1)无界面直接输出类(命名为“charcode”):
接受用户输入的汉字,直接计算(命名为“getcharcode”)。输出版权信息(命名为“version”)。
(2)窗体界面计算类(命名为“charform”):启动窗体界面(命名为“showform”)。

(三)示例COM的编制

1.创建动态链接库
启动Delphi 6,点击“File→New...”菜单命令,在打开的“New Items”对话框中,点击“ActiveX”选项卡,选择“ActiveX Library”。然后在打开的新工程窗口中,点击“File→Save All”菜单命令,保存该项目(假设文件名为“mycharcom”),Delphi会自动生成项目所需的文件。其中包括mycharcom.dpr(工程的项目文件)、mycharcom.res(项目资源文件)、mycharcom.dof(Delphi选项文件)、mycharcom.cfg(项目配置文件)。
2.建立COM接口对象
点击“File→New...”子菜单,在打开的新项目对话框中点击“ActiveX”选项卡,选择“Automation Object”。然后在项目中新建一个自动类型的COM对象,该类型的COM对象可自动注册,且自动支持被其他语言调用。此时在出现的对话框中输入COM类名(本例输入charcode),对话框中其他选项用于设置COM对象的性质,读者可查阅帮助信息。随后再以相同的方法建立另一个接口对象(命名为charform)即可。
3.编辑相应接口对象的属性和方法
点击“View→Type Library”菜单命令,启动类型库编辑器,类型库是存储COM对象说明的文件,也是一个可被多语言调用的头文件包。开发者可在类型库中定义COM对象的接口及接口对象的属性和方法等。
Delphi会自动产生MyCOM类的二个接口类Icharcode和Icharform,开发者可通过类型库编辑器为接口定义方法和属性:
(1)选择一个接口,然后点击编辑器顶部的“New Method”按钮。
(2)选择该方法,在“Arributes”选项卡的“Name”中输入方法名称(本例为getcharcode)。
(3)在“Parameters”选项卡中,点击“Add”按钮编辑方法的参数。本例需getcharcode(用于输入)和chinesechar(用于输出)两个BSTR类型的参数,其中chinesechar参数必须定义为指针型。
(4)“Flags”选项卡用于对接口的属性进行调整,一般不需设置。
(5)在“Text”选项卡中可查看生成的代码,如下所示:
[
id(0x00000003)
]
HRESULT _stdcall getcharcode([in] BSTR inputchar, [out, retval] BSTR * chinesechar );
(6)点击“Refresh”按钮,关闭类型库编辑器。
(7)当需为接口添加新属性和方法时,可重新打开编辑器继续添加。
(8)点击“File→Save All”菜单命令,Delphi会自动生成主要的相关文件。包括mycharcom_TLB.dcu(类型库文件)、mycharcom_TLB.pas(包含COM接口和对象的说明,其主要目的为方便访问,在客户程序中需将本文件包含至工程中)。
4.实现COM接口中的属性和方法
在自动添加的单元文件(charcode接口对应为Unit1)中会发现类型库编辑器中所定义的方法和属性的声明,开发者只需输入代码即可,如下所示:
//charcode接口的“version”属性对应代码
function Tcharcode.Get_version: WideString;
begin
result:=′编制:马文刚 版本:1.0′;
end;
// charcode接口的“getcharcode”属性对应代码
function Tcharcode.getcharcode(const inputchar: WideString): WideString;
var
q,w,qw:integer;
hz:string[3];
begin
if inputchar<>′′ then
begin
hz:=inputchar;
q:=ord(hz[1]);//取汉字的第一个字节
w:=ord(hz[2]);//取汉字的第二个字节
//计算区码
if q>160 then
q:=q-160
else
q:=q-31;
//计算位码
if w>160 then
w:=w-160
else
w:=w-31;
//合成后计算区位码
qw:=q*100+w;
//返回结果
result:=format(′%4d′,[qw]);
end;
end;
在charform接口自动添加的单元文件(对应为Unit2)中输入类型库编辑器所定义的方法代码,如下所示:
procedure Tcharform.showform;
begin
form1:=TForm1.Create(nil);//创建窗体
try
form1.ShowModal;//以模态的方式显示窗体
finally
form1.free;//释放窗体
end;
end;
由于该接口需显示一个窗体来进行区位码计算,因此需在工程中添加一个窗体,并使用前述的计算区位码的核心代码进行编制,在此不做详细介绍,读者可自行设计。

(四)注册并调用

1.生成并注册COM对象
代码输入无误后,保存全部项目。然后点击“Project→Builder 项目名”菜单命令,生成相应的DLL文件(本例为mycharcom.dll)。点击“View→Type Library”菜单命令,打开类型库编辑器,点击“Register”按钮,当出现提示对话框时,即完成COM对象的注册。
如果需要卸载该COM组件,可点击“Run→Uninstall ActiveX Server”菜单命令实现。
完成COM组件的注册后,即可在各种开发语言中进行调用,由此充分体现了COM组件的优点。
2.在其他语言中调用
本例生成的COM组件在Delphi中的调用,前述内容已有详细介绍,在其他各类常用的开发语言的调用方法如下所述:
(1)在VB中调用:
在基于VB语言的开发环境(包括VBA、VBScript和ASP等),可通过CreateObject函数来创建COM组件的实例,本例编制的组件在VB中创建的语法如下所示:
Dim comtest As Object
Set comtest = CreateObject(″mycharcom.charform″)
Set comtest = CreateObject(″mycharcom. charcode″)
在VB和VBA开发环境中,还可通过引用的方式调用COM组件。然后用New关键字创建,语法如下所示:
Dim comtest As New mycharcom.charform
Dim comtest As New mycharcom. charcode
(2)在JavaScript中调用:
在JavaScript中,可通过new ActiveXObject函数创建,本例编制的组件在JavaScript中创建的语法如下所示:
var comtest = new ActiveXObject(″mycharcom.charform″);
var comtest = new ActiveXObject(″mycharcom.charcode″);
COM接口技术较复杂,Delphi 6无疑是开发COM组件的优秀工具,其隐藏COM实现的细节,开发者仅需简单的步骤即可编制强大的COM程序。COM技术是软件开发的发展方向之一,也是实现软件工程中即插即用的有效途径。希望有更多的开发者投入COM应用软件领域,开发新一代的COM组件。