2024年3月14日发(作者:)

Delphi DcoM。缀 发 ;Ⅲ= ||| ≯j| 

魏景东 

摘要:介绍了MS DCOM组件的概念,并通过一个实例详细介绍其制作注册及其调用方法。 

关键词:Delphi7.0;COM/DCOM;接口;CORBA;Java Beans 

1 DCOM概念及作用 

DCOM是一种服务器,它将自己的服务包装在一个库中, 

而自身以对象的形式出现,其子函数叫做方法,由于在网络上 

的分布计算机上执行.全称是Distributed Component Object 

Module组件对象模板。 

在构件与开放分布式系统模型理论中,有3种技术规范或 

体系结构占主导地位.它们是COM/DCOM fComponent Object 

Module/Distributed Component Object Module)、Java Beans、 

CORBA fCommon Object Request Broker Architect)。c0M/DC0M 

是Mierosoft独家发布的构件对象模式技术规范,Java Beans是 

SUN在1994年12月提出的基于Java语言的构件模型. 

CORBA是由OMG(Object Management Group)在1989年提出 

的.得到了IBM、Microsoft、Sun、HP、Oracle、DEC等公司 

的广泛支持。主要探讨DCOM技术的应用.DCOM是COM 

的一种形式。COM一般在本地执行,而DCOM可看作是分 

布式的COM,一般在网络上的分布计算机上执行。c0M一般 

有两种形式,即动态链接库和可执行文件形式,而DCOM必 

需是可执行文件程序(DCOM是分布式的COM,是不能在客 

户程序的内存空问运行的,Microsoft Omce Excel就是一个典 

型的DCOM组件)。在COM/DCOM应用中,客户程序不必知 

道DC0M的存在形式和所处位置,只须知到统一接口即可。 

COM f动态连接库形式)可以不用RPC通信,而DCOM必 

须使用RPC远程调用。 

COM f动态连接库形式)与客户共同存在于同一内存空间, 

调用速度快,DCOM的速度只有C0M的万分之一。 

COM f动态连接库形式)的安全性不高,客户程序可以造成 

服务COM发生错误。DCOM安全性高,原因也是COM与客户 

程序共用内存空间造成的。 

COM程序配置简单,DCOM配置较复杂.毕竟DCOM牵涉到 

网络和安全性。 

2 DCOM组件的制作及调用方法 

为便于说明问题.假设该实例要作的DCOM组件中仅有 

如下两个方法: 

procedure GetName(out ServerName:WideString); 

safecall; 

procedure Add{Inxl,Inx2:Double;out OutX:Double); 

safecall; 

第一个方法功能返回一个预定的字符串,第二个方法将两 

个双精度数相加并返回结果(实际的DCOM组件可能要复杂 

的多)。 

2.1 DCOM组件的制作 

打开Delphi7.0开发环境,点顶菜单File—New一十0rther_ 

弹出New Items对话框。单击ActiveX标签,打开ActiveX选项 

卡。双击Automation Object弹出Automation Object Wizard引导 

窗口如图1所示。 

图1 Automation Object Wizard引导窗口 

在图1输入类名称、线程模型等参数,类名可任取,本 

例取ExampDcom,其他选缺省后点击“OK”按钮启动Type 

Library Editor,使用该编辑器创建上述两个方法,如图2所 

示。 

图2使用Type Library Editor创建方法示意图 

之后点击该编辑器顶部Refresh按钮.创建的方法定义就 

自动出现在unit2单元的编码中。 

盛壤 

………~…… …… 一…… ……… …… … “ … 

实用第一 智慧密集 

在unit2单元中找到方法定义,为Getnarne、Add分别添 

加编码ServerName:= DCOM服务器例程 ;,0utX:=Inxl+Inx2;。 

在unit1单元的forml窗体上添加一个Timerl,一个 

Labell。forml窗体的最终设计如图3所示。 

图3 Form1窗体示意图 

保存_丁=程,将unitl保存为Unit_Exam.pas,unit2保存为 

Unit

ExamDcom.pas,工程本身保存为Unit_Exam1.dpr。 

Unit Exam.pas的完整编码如下: 

unit Unit Exam; 

intedace 

USeS 

Windows,Messages,SysUtils,Variants,Classes 

Graphics,Controls。Forms。 

Dialogs,StdCtrls,ExtCtrls; 

type 

TFOrm 1=class(TForm) 

Timer1:l-Timer; 

Label1:TLabel; 

procedure FormCreate(Sender:TObject): 

procedure TimerlTimer(Sender:TObject); 

private 

{Private declarations) 

public 

{Public declarations) 

end; 

Var 

Form1:TFOrm1: 

implementation 

uses Unit

ExamDcom,Unit

_TLB—TLB 

{¥R .dfml 

procedure TForm 1.FormCreate(Sender:TObject); 

begin 

fOrm1.Hide; 

end; 

procedure TForm1.Timer1Timer(Sender:TObject); 

begin 

f0rm1.Hide; 

end; 

end. 

Unit

ExamDcom.pas的完整编码如下: 

unit Unit ExamDcom: 

{¥WARN SYMBOLPLATFORM OFF) 

intedace 

30 蠢涵20 1穗2.瞌12窍1与维 i《 

USeS 

ComObj,ActiveX,Unit_TLB_TLB,StdVcl; 

type 

TExampDcom=class(TAutoObject,I ExampDcom) 

protected 

procedure GetName(out ServerName:WideString);safecall; 

procedure Add(Inx1.Inx2:Double;out OutX:Double); 

safecall; 

end; 

imptementation 

uses ComServ; 

procedure TExampDcom.GetName(out ServerName: 

WideString); 

begin 

ServerName:= DCOM服务器例程 

end; 

procedure TExampDcom.Add(Inxl,Inx2:Double;out 

OutX:Double); 

begin 

OutX:=lnxl 4-Inx2; 

end; 

initialization 

TAutoObjectFactory.Create(ComServer,TExampDcom, 

Class.

ExampDcom, 

c Multilnstance.tmApartment); 

end 

其中Unit_TLB TLB是自动生成自动维护的DCOM类型 

库,不用人工干预。 

然后在Delphi菜单中选Project-- ̄Bulid Unit_Examl将工程 

制作成DCOM组件:Unit_Exam1.exe。至此,该DCOM组件制 

作完毕。 

2.2 DCOM组件的调用 

打开Delphi7.0开发环境创建工程Wdcom.dpr,为简单起 

见,假设该工程仅有一个窗体Forml,在FormI上依次放置3 

个Buaon按钮,3个Bu ̄on按钮的caption属性依次设置为: 

本地DCOM组件UnitExam1.exe的调用、远程DCOM组件 

UnitExam1.exe的调用、计算两数之和。Forml的caption属性 

设置为:DCOM组件Unit_Exam1.exe应用示例。窗体Forml的 

设计如图4所示。 

一隧 黝  

图4 Wdcom.dpr的Form1设计示意图 

该窗体Forml对应的单元保存为wdcom.pas,完整编码如下 

unit wdcom; 

…… 

PROGRAM LANGI隅B …………………………………………………………………………………………… 

interface 

uses 

Windows,Messages,SysUItils,Varia ̄nts,Cla,s,ses,Graphics, 

Controls,FOrms. 

Dialogs,.Unit_TLB—TLB,StdCtrIs; 

type 

TForm 1=class(TForm) 

Button1:TButton; 

BuJtton2:TButton; 

Button3:TButton; 

procedure Button1 Click(Sender:TObject); 

procedure Button2CIick(Sender:TObject); 

procedure Butt0n3Click(Sender:TObject); 

private 

{Private declarations) 

FExampDCOM:lExampDCOIM; 

public 

f Public declarations) 

end; 

Var 

Form1:TFOrm1: 

implementation 

(¥R .dfm) 

procedure TF0rm1.Button1 Click(Sender:TObject); 

Var 

s:widestring; 

begin 

FExampDCOM:=CoExampDCOIM.Create(); 

FExampDCOM.GetName(s); 

caption;= Local Connect tO:DCOM:U LExam1.exe : 

showmessage(s); 

end; 

procedure TForm1.ButtOn2Click(Sender:TObject); 

Var 

ResNuler:double; 

s:stnng; 

begin 

lf FExampDCOIM<>nil then 

jbegin 

FExampDCOM.Add(23,45,ResNum); 

s:=format('’Double=%f8 ,[ResNul11】) 

showmessage(s); 

end; 

end; 

procedure TF0rm1.Button3Click(',,'Sender:TObject); 

var 

ServerNalme:string; 

s:widestring,: 

begm 

if I[InputOuery( Enter Server Name', Server Name , 

ServerName))then 

begin 

FExampDCOM- =CoEx ̄mpDCOM.CreatelRemote 

I[WideString(ServerNalme)) 

FExampDCOM.Get}、lame(s); 

cakption:='Remote Connect to:DCOM:Unht_lExam1.exe : 

showmess ̄age(s): 

end; 

end; 

end. 

其运行示意图如图5所示。 

l掣豳阉 霸固 

l匠

m 

 毫 I

I l

l蛳正翮l m I 

图5 Wdcom.dpr运行示意图 

需要指出的是.在单元wdcon3..pas中一定要uses 

UnitTLB

_

TLB,再者运行该示例,需要把本机的RPC服务启 

动,如果是远程调用的话,还需将DCOM组件UniLExam1.exe 

复制到远程主机并启动,同时将远程主机的RPC服务启动 

(关闭防火墙),还需在远程主机上运行Ocomcnfg.exe,进入组 

件服务窗口,展开左边组件服务一计算机一我的电脑一DC0M 

配制(展开)一右击找到的ExampDcom object--.点击属性进入 

ExampDcom 0biect属性对话框.在常规选项卡上将身份验证 

级别选无,在标识选项卡上选交户式用户,在位置选项卡上 

将在此计算机上运行应用程序 选项打钩,在安全选项卡上 

将启动激活权限、方问权限设为自定义并将Everyone添加到其 

中且Everyone本地访问、远程访问均允许。 

3结语 

上述示例是典型的使用Delphi开发工具进行DCOM组件 

制作及调用应用示例,在Windows XP及Windows Server 2003 

成功运行,示例简单过程完整,希望对初步从事分布式应用组 

件开发的软件技术人员参考。 

参考文献 

[1】东方人华,吕伟臣.Delphi"/,.0入门与提高.清华大学出版 

社.2003.06. 

(收稿日期:2012—05—04) 

l|i鳞 糕