贴一文章:
Delphi开发用于ASP的OLE Automation Server
孙以义, 杜鹃
华东师范大学,200062, 上海
yysun@263.net
一、前言
ASP (Active Server Page)是微软公司的产品,作为其Web服务器的扩充,实现服务器端的脚本控制,它的优点是直接能嵌入HTML文档,相对于CGI方式,编程和测试均很方便。在一些文章中已经有所介绍。ASP本身是解释执行的,很难对系统作深层次的控制,但是ASP的最大特点是对OLE Automation的支持,这样使得它几乎获得了无限的可扩展性,例如配合微软的ADO (ActiveX Data Objects) 就能连接数据库,作数据处理和封装处理逻辑,以开发Web数据库应用系统。ASP产品本身带有了用VB/VC开发OLE Automation Server的实例,但是除了用VB或者VC++来开发OLE Automation Server以供ASP网页使用,Inprise公司的Borland Delphi 3 / 4 对OLE Automation Server也有着很好支持,某种程度上讲,用Delphi开发OLE Automation Server的方便程度超过了使用VC++的ATL。所以本文要介绍的是用Borland Delphi开发配合ASP 使用的OLE Automation Server的方法。
二、ASP示例说明
为了能清晰地说明这个技术方法,本文例举了一个实际例子。调用OLE Automation Server的ASP文件(Test.asp)如下:
<html>
<head>
<title> Delphi开发OLE Automation Server的试验</title>
</head>
<body>
下面一行字是由Delphi开发的OLE Automation Server输出的<hr>
<%
set DelphiObj = Server.CreateObject("MyServer.TestObj")
DelphiObj.WriteHelloWorld
Response.Write "<br> <hr>"
set DelphiObj = nothing
%>
</body>
</html>
这个ASP网页将创建一OLE Automation 对象,然后调用它的一个过程,在网页中输出一些文字,此OLE Automation 对象用Delphi开发,以下详细介绍开发方法。
三、OLE Automation Server的建立过程
1、创建ActiveX库(ActiveX Library)
Borland Delphi 3 / 4中有ActiveX Library的模板,启动Delphi,选择菜单 File | New,会出现“New Item”对话框(图1),在“ActiveX”页中选择“Library”,Delphi会自动创建一个新的DLL Project,其源代码如下:
library Project1;
uses ComServ;
exports
DllGetClassObject,
DllCanUnloadNow,
DllRegisterServer,
DllUnregisterServer;
{$R *.RES}
begin
end.
(图1)
2、创建Automation对象(Automation Object)
接下来可以使用Borland Delphi 3 / 4中Automation Object Wizard创建Automation对象,仍然选择菜单 File | New,在“New Item”对话框的“ActiveX”页中选择“Automation Object”,然后在“Automation Object Wizard”中输入Class Name为TestObj(图2) 。
(图2)
创建Automation对象时Delphi同时会生成类库,类库就是它们是外部程序可以调用的Automation对象的属性(property)和方法(method)的定义。在本例中定义了方法procedure WriteHelloWorld; 这个WriteHelloWorld的作用是让ASP调用,在网页中输出演示性文字用的定义好之后,按“Refresh”,Delphi自动生成代码框架。
unit Unit1;
interface
uses
ComObj, ActiveX, Project1_TLB;
type
TTestObj = class(TAutoObject, ITestObj)
protected
procedure WriteHelloWorld; safecall;
end;
implementation
uses ComServ;
procedure TTestObj.WriteHelloWorld;
begin
end;
initialization
TAutoObjectFactory.Create(ComServer, TTestObj, Class_TestObj, ciMultiInstance);
end.
框架中Delphi自动继承了TautoObject并包含我们定义的ItestObj接口(ItestObj则是从Idispatch继承下来),并且Delphi已经为我们生成了代码的输入点。编辑过程中,如果类库编辑窗口被关闭了,以后可以选择菜单View | Type Library来打开类库编辑窗口。
最后保存文件为uTestObj.pas,保存新的Project为MyServer.dpr。
3、编译和注册OLE Automation Server
选择菜单 Project | Compile,即能编译生成MyServer.dll,这个DLL要在网页中起作用,还需放置到具有执行属性的目录(例如 /scripts),并注册后才能使用,注册方法是使用regsvr32.exe,命令行: regsvr32 MyServer.dll,NT4中regsvr32.exe 往往在/winnt/system32/目录中,Windows95/98中regsvr32.exe 往往在/windows/system/目录中。
四、引入ASP的类库
上述过程解释了用Delphi创建一个通用的OLE Automation In-Process Server的过程,ASP页面已经可以用set DelphiObj = Server.CreateObject("MyServer.TestObj")来创建对象,但是该对象尚未能在网页中输出任何信息。如何在ASP页面中输出文字呢?这还需要引入ASP的类库,使得ASP中的对象能在Delphi程序中调用。方法是选择菜单 Project | Import Type Library,出现“对话框”,选择“Microsoft Active Server Pages Object Library” (图3),Delphi自动翻译ASP注册类库为Object Pascal 语法的说明ASPTypeLibrary_TLB.pas,这样就可以象一般的Delphi VCL一样方便地调用ASP中的注册对象了,它们是Application, Server, Session, Request and Response.
(图3)
其中Response就是ASP中可以输出文字的对象,要在网页中输出文字,我们只需如下修改:
1) 用类库编辑器为ItestObj,增加方法OnStartPage(MyScriptingContext: IUnknown);
2) 为TtestObj增加私有变量FScriptCtx: IScriptingContext;
3) 如下修改WriteHelloWorld和OnStartPage过程的代码。
4) 在uses 中加入ASPTypeLibrary_TLB;
最后uTestObj.pas变成为:
unit uTestObj;
interface
uses ComObj, ActiveX, MyServer_TLB, ASPTypeLibrary_TLB;
type
TTestObj = class(TAutoObject, ITestObj)
private
FScriptCtx: IScriptingContext;
protected
procedure WriteHelloWorld; safecall;
procedure OnStartPage(MyScriptingContext: IUnknown); safecall;
end;
implementation
uses ComServ;
procedure TTestObj.WriteHelloWorld;
begin
FScriptCtx.Response.Write('Hello World ! <br>');
end;
procedure TTestObj.OnStartPage(MyScriptingContext: IUnknown);
begin
FScriptCtx:=MyScriptingContext as IScriptingContext;
end;
initialization
TAutoObjectFactory.Create(ComServer, TTestObj, Class_TestObj, ciMultiInstance);
end.
存盘并编译出新的MyServer.DLL,试验载入Test.asp,就会出现入图的页面(图4)。
(图4)
五、结语
本文展示了用Borland Delphi快速方便地开发出能供ASP网页调用的OLE Automation Server的方法。虽然上文仅演示了Response及其write功能,其他几个对象如Application, Server, Session, Request等使用的方法是相同的,例如Request.Cookie来设置网页的个性化参数等等,本文介绍的例子可以作为一个通用模板,作为用Delphi开发具有更加复杂功能的OLE Automation Server起点。