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鳞 糕


发布评论