文章

用Delphi开发用于ASP的OLE Automation Server

一、前言

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)如下:





Delphi开发OLE Automation Server的试验





下面一行字是由Delphi开发的OLE Automation Server输出的




<%

set DelphiObj = Server.CreateObject("MyServer.TestObj")

DelphiObj.WriteHelloWorld

Response.Write "

"

set DelphiObj = nothing

%>





这个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 !
');

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起点。