使用DELPHI6开发DCOM原型及其思考(200分)

  • 主题发起人 主题发起人 房客
  • 开始时间 开始时间

房客

Unregistered / Unconfirmed
GUEST, unregistred user!
图片版请访问http://jp.njuct.edu.cn/crystal/uploadtools/members/DELPHI6DCOM.mht
源代码请到http://086net.com下载
使用DELPHI6开发DCOM原型及其思考
作者:房客 tingweb@wx88.net

COM和DCOM的开发在DELPHI IDE中都不是令人头疼的事情,我们在飘逸在应用其自带的MIDAS组件面板(DELPHI6的DataSnap组件面板)来建立我们的DCOM应用(当然这也可能是受李唯老师那三本要人命的入门书引导)。
我们先来感受如何直观理解本文标题的含义——制作流程,最后再为大家介绍一下相关的知识和方向。
我们的方式分2步,先建立DCOM服务器(Application Server),再建立DCOM客户端(Client),在DELPHI环境(默认为打开空的Application工程)直接File菜单的New项的Other,然后选择ActiveX面板中的Automation Object(不明白的如图1):

(图1)
填写CoClassname,Delphi将帮你“自动化”一系列框架代码和接口、参数(不明白的如图2):

(图2)
此时TypeLibrary编辑器将自动弹出,我们也可以在任何时候在View菜单中的TypeLibrary将其激活(类似我们经常使用F12来切换Form和Code编辑区)。WHAT?从没用过TypeLibrary编辑器?OK,假设我们保存了工程为DCOMAppServer.dpr,主Form代码文件为Unit1.pas,我们的COM服务器文件(之后解释为什么这里称其为COM而不是DCOM)为DCOM_tlb.pas,然后在TypeLibrary编辑器中选择IDCOMAntetype,这是该DCOM的接口参数(不明白的如图3):

(图3)
我们接着干,注意TypeLibrary编辑器的快捷菜单,我们单击NewMethod(图3鼠标停留处),来建立我们需要的Procedure或者Function,我们试建立名为GetFile的函数,功能是以id来返回一个文件(今天我们就不HelloWorld了):
Function GetFile(id:integer): OleVariant;
TypeLibrary编辑器中单击这个Method,跳转到Parameters面板来定义该函数的参数(注意哦,这里接触的是一个类工厂(ClassFactory)设计方法的概念,OO就是以设计函数和类为基础的),我们把眼光放到属性问题上,点击参数的Modifier会让你设置In(输入)或者Out和Retval(输出返回),不明白的如图4和5:

(图4)

(图5)
保存一下,看看Delphi为我们做了什么,不明白的如图6:

(图6)
我们来填写函数实现功能(通俗地说就是在应用程序服务器实现应用逻辑),请配合
uses中添加Classes(TFileStream)、Variants(VarArray操作)和SysUtils(fmOpenRead)三项,这样服务器编译完成,不明白的如图7:

(图7)
开始建立该DCOM的客户端,DELPHI重新建立一个Application,窗体添加一个按钮,不明白的枪毙后如图8:

(图8)
由于要使用DCOMAntetype定义的类型库,我们在客户端为项目添加DCOM服务器中的类型库文件DCOMAppServer_TLB.pas(功能快捷键Shift+F11)并在uses中引用DCOMAppServer_TLB,老师上课应该都讲过的,不赘图了。然后实现ClientGetFile的功能,不明白的如图9:

(图9)
启动客户端和服务器端(服务器端只要在操作系统运行注册过即可由客户端随用随激活动),范例代码中的127.0.0.1可以是也计算机名,操作客户端你会发现“服务器端所在目录的指定文件2.txt内容被读到客户端所在目录的指定文件x2.txt中”,至此该DCOM原型开发完成。

思考一:
DCOM(于1996年推出)的应用程序服务端的配置在MSWindows95和MSWindows98下是众所周知的不简单,因此强烈建议使用MSWindowsNT/2000/XP作为服务运行端,但Microsoft还是尽心提供DCOM95(http://www.microsoft.com/com/dcom/dcom95/download.asp)和DCOM98(http://www.microsoft.com/com/dcom/dcom98/download.asp)。

思考二:
该DCOM服务的建立和COM的建立基本雷同但我们毕竟建立在进程外的COM服务器,在客户端建立通讯的时候我们就能发现其区别:
CoDCOMAntetype.CreateRemote(DCOM)
CoDCOMAntetype.Create(COM)
实际上DCOM的开发是建立在COM开发上的,因此这样合法的DCOM服务器完全可以作为COM服务器来使用。我们建立的DCOM服务器是一个进程外COM服务器(使之可以运行在不同计算机)。DELPHI引入类型库编辑的概念把开发人员从标准COM开发中解放出来。

思考三:
我们在范例中直接引用类型库源文件来提供DCOM接口,这是比较直观的偷懒的办法,我们通常导入一个.tlb类型库文件的做法是从Project菜单的Import Type Library项,添加(ADD)按钮指定tlb文件(如该项目为我们生成了DCOMAppServer.tlb文件)到工程。不明白的请如图10:

(图10)

思考四:
分布式计算的是整个计算机领域的革命性转变。其突出作用在于
对象化的RPC(Remote Procedure Call)
对象间的互操作性
对象间信息的传递
COM/DCOM是解释业务逻辑的一种表现方式,目前不断发展的衍生、相关技术还有CORBA、EJB(J2EE)、RMI、SOAP(WebServices)等,群雄逐鹿。
 
片版请访问http://jp.njuct.edu.cn/crystal/uploadtools/members/DELPHI6DCOM.mht
源代码请到http://086net.com下载
使用DELPHI6开发DCOM原型及其思考
作者:房客 tingweb@wx88.net
COM和DCOM的开发在DELPHI IDE中都不是令人头疼的事情,我们在飘逸在应用其自带
的MIDAS组件面板(DELPHI6的DataSnap组件面板)来建立我们的DCOM应用(当然这也可能
是受李唯老师那三本要人命的入门书引导)。
我们先来感受如何直观理解本文标题的含义——制作流程,最后再为大家介绍一下相关的
知识和方向。
我们的方式分2步,先建立DCOM服务器(Application Server),再建立DCOM客户端(Client)
,在DELPHI环境(默认为打开空的Application工程)直接File菜单的New项的Other,
然后选择ActiveX面板中的Automation Object(不明白的如图1):

(图1)
填写CoClassname,Delphi将帮你“自动化”一系列框架代码和接口、参数(不明
白的如图2):

(图2)
此时TypeLibrary编辑器将自动弹出,我们也可以在任何时候在View菜单中的TypeLibrary
将其激活(类似我们经常使用F12来切换Form和Code编辑区)。WHAT?从没用
过TypeLibrary编辑器?OK,假设我们保存了工程为DCOMAppServer.dpr,主Form代码文
件为Unit1.pas,我们的COM服务器文件(之后解释为什么这里称其为COM而不是DCOM)
为DCOM_tlb.pas,然后在TypeLibrary编辑器中选择IDCOMAntetype,这是该DCOM的接口
参数(不明白的如图3):

(图3)
我们接着干,注意TypeLibrary编辑器的快捷菜单,我们单击NewMethod(图3鼠标停留处)
,来建立我们需要的Procedure或者Function,我们试建立名为GetFile的函数,功能是
以id来返回一个文件(今天我们就不HelloWorld了):
Function GetFile(id:integer): OleVariant;
TypeLibrary编辑器中单击这个Method,跳转到Parameters面板来定义该函数的参数
(注意哦,这里接触的是一个类工厂(ClassFactory)设计方法的概念,OO就是以设计
函数和类为基础的),我们把眼光放到属性问题上,点击参数的Modifier会让你设置In
(输入)或者Out和Retval(输出返回),不明白的如图4和5:

(图4)

(图5)
保存一下,看看Delphi为我们做了什么,不明白的如图6:

(图6)
我们来填写函数实现功能(通俗地说就是在应用程序服务器实现应用逻辑),请配合
uses中添加Classes(TFileStream)、Variants(VarArray操作)和SysUtils(fmOpenRead)
三项,这样服务器编译完成,不明白的如图7:

(图7)
开始建立该DCOM的客户端,DELPHI重新建立一个Application,窗体添加一个按钮,
不明白的枪毙后如图8:

(图8)
由于要使用DCOMAntetype定义的类型库,我们在客户端为项目添加DCOM服务器中
的类型库文件DCOMAppServer_TLB.pas(功能快捷键Shift+F11)并在uses中引用
DCOMAppServer_TLB,老师上课应该都讲过的,不赘图了。然后实现ClientGetFile的功能
,不明白的如图9:

(图9)
启动客户端和服务器端(服务器端只要在操作系统运行注册过即可由客户端随用随激
活动),范例代码中的127.0.0.1可以是也计算机名,操作客户端你会发现“服务器端
所在目录的指定文件2.txt内容被读到客户端所在目录的指定文件x2.txt中”,至此该
DCOM原型开发完成。

思考一:
DCOM(于1996年推出)的应用程序服务端的配置在MSWindows95和MSWindows98下是
众所周知的不简单,因此强烈建议使用MSWindowsNT/2000/XP作为服务运行端,但
Microsoft还是尽心提供DCOM95
(http://www.microsoft.com/com/dcom/dcom95/download.asp)
和DCOM98(http://www.microsoft.com/com/dcom/dcom98/download.asp)。

思考二:
该DCOM服务的建立和COM的建立基本雷同但我们毕竟建立在进程外的COM服务器,
在客户端建立通讯的时候我们就能发现其区别:
CoDCOMAntetype.CreateRemote(DCOM)
CoDCOMAntetype.Create(COM)
实际上DCOM的开发是建立在COM开发上的,因此这样合法的DCOM服务器完全可以作
为COM服务器来使用。我们建立的DCOM服务器是一个进程外COM服务器(使之可以运行在
不同计算机)。DELPHI引入类型库编辑的概念把开发人员从标准COM开发中解放出来。

思考三:
我们在范例中直接引用类型库源文件来提供DCOM接口,这是比较直观的偷懒的办法,
我们通常导入一个.tlb类型库文件的做法是从Project菜单的Import Type Library项,
添加(ADD)按钮指定tlb文件(如该项目为我们生成了DCOMAppServer.tlb文件)到工程。
不明白的请如图10:

(图10)

思考四:
分布式计算的是整个计算机领域的革命性转变。其突出作用在于
对象化的RPC(Remote Procedure Call)
对象间的互操作性
对象间信息的传递
COM/DCOM是解释业务逻辑的一种表现方式,目前不断发展的衍生、相关技术还
有CORBA、EJB(J2EE)、RMI、SOAP(WebServices)等,群雄逐鹿。


 
可以给电脑报投稿呀
 
这么水的文章不是教坏了大家:)
 
采用DCom技术如何实现在Internet上连接远程应用服务器?
DComAntetype := CoDCOMAntetype.CreateRemote('应用服务器名')
其中应用服务器名不能为IP地址啊。
 
个人意见:
1.尽量少用Windows平台上专用的分布式技术,比如COM, DCOM, COM+, MTS。其他技术既然又能
在Windows上用,也能用于其他平台,何乐而不为呢?
2.关于DCOM,李维的书讲的确实有点片面,搞的现在DFW上一看到DCOM的标题,内容必是三层数
据库(本帖除外)。
3.CORBA之所已在Delphi程序员中不是太流行,那是因为在Delphi 5以前对CORBA的实现用的是类
似DCOM的方法。而在Delphi 6中所带的VisiBroker中用的是IDL2PAS编译器,这才是正统的CORBA使
用方法。(君不见IDL2JAVA已经用了多少年了,若是让JBuilder程序员知道我们才开始将IDL编译
成PASCAL单元,肯定要笑话我们)。另:VisiBroker好象只能用在局域网上。
4.关于EJB的Delphi实现,只是听说过有个什么SIDL支持,可一点也不会用,还望各为大虾多指点
指点。
5.至于RMI在我的理解是纯Java-to-Jave的分布式应用,从一个JVM上调用另一个JVM上的Java对象。
Delphi 6可以使用这个技术么?
6.SOAP可已说是最近炒的最火的了,跨语言跨平台。用了一点,确实是个好东东,就是效率有待提
高。Delphi 6中的SOAP是RPC-Style的,同绝大多数厂商对SOAP的支持相同。偏偏有个败类叫Micro
Soft,它在.Net中实现的SOAP是Document-Style的,用起来不是很爽。
7.yysun老板的那个wsdl好象不能用了。另外,不知哪为仁兄能提供一块风水宝地,让大家写一点
SOAP一块享用。
 
多人接受答案了。
 
后退
顶部