delphi中ActiveX 和 Web

http://book.77169.com/data/web5302/20050228/20050228__3692503.html

ActiveX 和 Web

在Windows 操作系统下,有一个重要的机制,就是OLE ,就是可以让某
个应用程序(OLE Controller)访问其它应用程序(OLE Server)所提供的
功能,这样做的好处是,如果已经有了完成某项功能的程序,你就不必再为
某项功能编写特定的应用程序,可以直接通过OLE 调用。


一、 制作用Web 调用的ActiveX

首先设置一个虚拟目录,定名为Delphi

1)进入Delphi,Close all
2)New -> Other -> ActiveX -> ActiveX Form ->Name: MyActiveX
OK
3)出现一个普通的Form界面,放入
TButton
TListBox
TEdit
三个控件,设计目标是,点Button后ListBox添加一个Edit的内容。
4)Save all 到虚拟目录的 ActiveX/Ac2/ 子目录下。
5)双击Button,在Button1Click事件程序下写:

ListBox1.items.add(edit1.text);

6)这就完成了,保存。

7)Porject ->Build All 编译

8)Porject -〉Web Deployment Options 设置分发参数
第一项:OCX保存的目录 (虚拟目录/ActiveX/ac2/)
第二项:OCX保存在哪个相对路径中
(http://127.0.0.1/delphi/ActiveX/ac2/)
第三项:Delphi产生的HTML 保存路径(虚拟目录/ActiveX/ac2/)
Ok
9)产生嵌入ActiveXForm的HTML文件
Porject -〉Web Deploy

现在保存这个工程然后退出

观察效果

打开IE浏览器, 把网址写为:http://127.0.0.1/delphi/activex/ac2/
就可以看到下面的文件列表:

[To Parent Directory]
2000年5月27日 9:10 750 MyActiveImpl1.~dfm
2000年5月27日 9:11 9160 MyActiveImpl1.~pas
2000年5月27日 9:31 16936 MyActiveImpl1.dcu
2000年5月27日 9:16 51 MyActiveImpl1.ddp
2000年5月27日 9:14 778 MyActiveImpl1.dfm
2000年5月27日 9:15 9307 MyActiveImpl1.pas
2000年5月27日 9:11 334 MyActiveProj1.~dpr
2000年5月27日 9:11 6424 MyActiveProj1.~tlb
2000年5月27日 9:27 386 MyActiveProj1.cfg
2000年5月27日 9:27 1436 MyActiveProj1.dof
2000年5月27日 9:11 334 MyActiveProj1.dpr
2000年5月27日 9:29 382 MyActiveProj1.htm
2000年5月27日 9:31 477696 MyActiveProj1.ocx
2000年5月27日 9:27 1836 MyActiveProj1.res
2000年5月27日 9:11 6424 MyActiveProj1.tlb
2000年5月27日 9:11 15377 MyActiveProj1_TLB.~pas
2000年5月27日 9:31 11952 MyActiveProj1_TLB.dcu
2000年5月27日 9:11 15377 MyActiveProj1_TLB.pas

其中:MyActiveProj1.htm 就是刚才内嵌的HTML文件,点击这个超级
链接,就可以看到包含ActiveX的网页了。
打开这个网页的源代码,可以看到这个HTML文件中真正重要的是下面
的一段,把这一段镶嵌到任何一个网页中,都可以调用这个ActiveX 。而
其它部分可以用诸如Frontpage 等网页设计软件来完成。

<OBJECT
classid="clsid:937B0348-FF1E-4E70-9244-3375EF9AF5E5"
codebase="http://127.0.0.1/delphi/ActiveX/Ac2/MyActiveProj1.ocx#version=1,0,0,0"
width=313
height=248
align=center
hspace=0
vspace=0
>
</OBJECT>

真正使用的时候,codebase要使用下面的地址

codebase="http://127.0.0.1/delphi/ActiveX/Ac2/MyActiveProj1.ocx

要改成OCX文件存放的真正的网址。

二、在ActiveX程序中访问远程数据库

从表面上看,ActiveX 程序只要做成访问数据库的形式,再放到网页
上就可以了,实际上不然,首先是你无法保证


三、如何分发(Peploy)完成的ActiveX应用程序

多层结构必须把MIDAS.DLL复制到前台计算机,还包括其他种类的文件。
例如,必须包括MIDAS.DLL文件,所以,就需要在打开网页的同时,同时
下载相关文件。
方法:
1) 建立ActiveX控件;
2) [project]->[Web Deployment Options]打开选项卡;
3) 用前面的方法,设置好OCX和HTML文件的URL 和目录位置。
4) 选中最后一个多选框(共六个,Deploy additional file)
这样就可以自动分发相关文件。
5) 选取Additional File选项卡,加入文件(Add),分发文件的位置,
和OCX和HTML相同就可以了。
6) 打开[project]->[Web Deploy]命令,产生分发的HTML文件。
7) 问题是分发的文件都会下载到C;/Windows/Occache下,也就是IE浏
览器下载OCX 临时文件夹,但如果下载MIDAS.DLL页下载到这个文件夹, 数
据库系统将无法正常工作的。
8) 重新看一下网页的源代码:
<HTML>
<H1> Delphi 6 ActiveX Test Page </H1><p>
You should see your Delphi 6 forms or controls embedded in the form below.
<HR><center><P>
<OBJECT
classid="clsid:18EA6FB4-5694-491E-818B-10F22C2EDDF7"
codebase="http://127.0.0.1/cgi/act/act1/MyActiveProj1.inf"
width=281
height=254
align=center
hspace=0
vspace=0
>
</OBJECT>
</HTML>
--------------------------------------------------------------------

我们会发现codebase="http://127.0.0.1/delphi/ActiveX/Ac2/MyActiveProj1.ocx
变成了:
codebase="http://127.0.0.1/cgi/act/act1/MyActiveProj1.inf"

--------------------------------------------------------------------
其中MyActiveProj1.inf是一个文本文件,打开来看一下:
--------------------------------------------------------------------
;Delphi-generated INF file for MyActiveProj1.ocx
[Add.Code]
MyActiveProj1.ocx=MyActiveProj1.ocx
MIDAS.DLL=MIDAS.DLL

[MyActiveProj1.ocx]
file=http://127.0.0.1/cgi/act/act1/MyActiveProj1.ocx
clsid={18EA6FB4-5694-491E-818B-10F22C2EDDF7}
RegisterServer=yes

[MIDAS.DLL]
file=http://127.0.0.1/cgi/act/act1/MIDAS.DLL
--------------------------------------------------------------------
现在把最后一段改一下
[MIDAS.DLL]
file=http://127.0.0.1/cgi/act/act1/MIDAS.DLL
DestDir=11

DestDir=11用来指定下载的目的路径,11代表C:/windows/system,
如果出现了 RegisterServer=yes,要把它删掉,因为这表明要注册,
而MIDAS.DLL是不需要注册的。
好了,现在可以正常工作了。



四、TCP/IP协议和Socket

前面所讨论的多层结构,都是应用了DCOM机制,这种机制在局域网上传输,
特别是在Windows NT/2000 服务器下,是没有任何问题的,但是,如果要在广
域网上实现多层结构,就带来了一个问题,因为广域网现在采用的是TCP/IP协
议,DCOM机制在广域网上无法使用,如何解决这个难题呢?
为了解决这个问题,Delphi提供了一个Socket(插座)的类,专门用于解
决这个问题,它的基本思想为:
在客户端,用一个新的控件TSocketConnection代替原来的TDCOMConnection,
其余的连接不变,这就大大简化了客户端的设计。但是,TSocketConnection
走的是TCP/IP,它自然会对应到服务器端的某个端口(Service Port),所以,
在服务器端也应该设置一个相应的服务程序,监听用户的端口号,并在号码相
同时,提供对应的服务。
这样一来,已经设计好的服务器应用程序不需要做任何变动就可以使用了,
实际上这样的多层服务程序既可以在局域网上使用也可以在广域网上使用。
实例:
1)在服务器端打开C:/WINNT/system32/drivers/etc/Services

这是一个文本文件,可用记事本打开,查看当前服务器上已经有哪些Service,
这些Service又用到了哪些端口号(port number),例如:

# Copyright (c) 1993-1999 Microsoft Corp.
#
# This file contains port numbers for well-known services defined by IANA
#
# Format:
#
# <service name> <port number>/<protocol> [aliases...] [#<comment>]
#

echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp users #Active users
systat 11/tcp users #Active users
daytime 13/tcp
daytime 13/udp
qotd 17/tcp quote #Quote of the day
qotd 17/udp quote #Quote of the day
chargen 19/tcp ttytst source #Character generator
chargen 19/udp ttytst source #Character generator
ftp-data 20/tcp #FTP, data
ftp 21/tcp #FTP. control
telnet 23/tcp
smtp 25/tcp mail #Simple Mail Transfer Protocol
time 37/tcp timserver
time 37/udp timserver

.........................

您下面要选择的端口号不能与这些号码相重复。

2)在服务器端,找到Delphi的目录,找到:
Program Files/Borland/Delphi 6/Bin/Scktsrvr.exe
运行,就可以在Windows可以看到一个TCP/IP的Service以启动的图标(
插座的形状)。在图标上右键,选Properties,就出现一个对话框:
Listen on Port(侦听端口):默认是211,可以根据情况选新的号。
这个号码,也就是客户机做Socket 连接时所必须使用的号。
这样就可以把Delphi提供的多层结构数据库Post到Internet上了。

这是手动安装的情况,但是,手动安装的Socked Server在服务器每次
关机后,必须重新安装才能启动,十分不方便。所以,还有另一种把
Socked Server变成NT Server的方法,在DOS Prompt下,执行下列命令:
Program Files/Borland/Delphi 6/Bin > Scktsrvr/inatall
安装成功后您就可以看到一个安装成功的信息显示。
这时打开[控制面板]-〉[管理工具]-〉[服务]工具程序
您可以发现一个 Socked Server , 这就是刚才加入进来的项目,它
的默认启动状态是“自动”,这就是以后服务器启动后,Socked Server
也将自动被打开了。

3)客户端:
制作一个标准的Form,加入:
DataSnap页:
TSocketConnection(以取代原来的DCOMConnection)
DataAccess页:
TClientDataSet
TDataSource
Data Controls页:
TDBGrid

设置属性:
SocketConnection1属性:
Address=服务器IP地址,本机时:127.0.0.1
Host=服务器名(可以通过网上邻居查找)
Address和host只要用一种方法就可以了。
Port=端口号(这里为211)
ServerName=服务器端应用程序名
Connected=true表示连上
ClientDataSet1属性:
RemoteServer=SocketConnection1
ProviderName=DataSetProvider1(具体名字由
服务器端提供)
Active=true(表示连上)
DataSource1属性:
DataSet=ClientDataSet1
DBGrid1属性:
DataSource=DataSource1
运行一下,可以看到和走DCOM通道是一样的,但现在是走的TCP/IP协
议的通道。
如果在服务器上关闭Borland Socked Server, 立刻就可以发现客户
端的联系中断了。
更复杂的情况,包括走广域网的ActiveX控件。都可以采用这种方法,
不过,在广域网上并不太赞成使用ActiveX控件。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值