请教,关于Delphi做的CGI程序的发布问题。急用!(100分)

  • 主题发起人 主题发起人 gongshl
  • 开始时间 开始时间
G

gongshl

Unregistered / Unconfirmed
GUEST, unregistred user!
我用Delphi做的CGI程序(web server application),在我的电脑上可以执行,
但把程序拷到其它电脑,设置好虚拟目录后,却不能执行,出现如下错误:
CGI Error
The specified CGI application misbehaved by not returning a complete set of HTTP headers. The headers it did return are:

是不是用Delphi开发时,就在本地电脑上注册了什么组件,需要安装到其它电脑上,
才能在那台电脑上执行呢?
 
请高手帮帮我!
 
照如下步做试试;



第一节 准备工作

虚拟目录的建立

Windows 2000下:

控制面板-〉管理工具 -〉internet服务管理器 -〉默认Web站点-〉右键-〉新建
虚拟目录
别名:在URL 上调用的名字;
目录:虚拟目录实际的文件夹名。

访问权限要选以下三项:
读取
运行脚本(例如 ASP)
执行(例如 ISAPI 应用程序或CGI)

否则执行CGI 程序会试图下载

第二节 第一个CGI

为了测试虚拟目录是否建立的正确,同时也对CGI 的程序架构有个
一般的了解,我们可以先做一个最简单的程序,使它真正的运行起来。

1)建立一个普通的工程
2)把Unit删掉,只保留工程,然后按如下写代码:

program CgiData;
{$APPTYPE CONSOLE}
uses
sysutils;
begin
writeln('HTTP/1.0 200 ok');
writeln('CONTENT-TYPE:TEXT/HTML');
writeln; /这里的空一行是必需的。
writeln('<html><head>');
writeln('<title>这是我的第一个CGI</title>');
writeln('</head><body>');
writeln('<h1>这是个报时的程序<h1>');
writeln('<hr>');
writeln('<h3>');
writeln(formatdatetime(
'"今天是"dddd,mmmm,d,yyyy,'+
'"<br>时间是"hh:mm:ss AM/PM',
Now));
writeln('</h3>');
writeln('</body>');
writeln('</html>');
end.

编译以后就可以成为一个CGI 程序了。把这个EXE 文件拷贝到
CGI 虚拟目录下,打开浏览器,在URL 栏中写下:

http://127.0.0.1/cgi/CgiData.exe

这时网页上应该出现报时的文字。



第二节 ISAPI服务器程序设计接口

CGI 虽然是一种比较成熟的Web 服务器应用程序,但是它有严重
的缺点,限制了它的应用。因为它是EXE 文件,这就意味着,每当前
台浏览器送出请求执行CGI 程序时,它都将在服务器占用一个进程,
当请求比较多的时候,将严重影响服务器的运行效率。
为了解决上述问题,可以采用Web 服务器本身提供给开发人员使
用的程序接口,比较多的是微软提出来的ISAPI(Internet Server
Application Programming Interface),或Netscape的NSAPI(Nescape
Server Application Programming Interface )。对于微软的操作
系统来说,使用ISAPI 是个合理的选择。
ISAPI 与CGI 最大的差别,在于ISAPI 使用了动态连接库取代了
CGI 的EXE 文件,而DLL 有与Web 服务器共享单一内存空间的特性,
比可执行文件消耗较少的内存资源,相对减少了Web 服务的的负担。
当多个用户请求时,服务器将自动产生多个线程,这些线程共享
一个进程,与CGI 为每个用户产生一个进程相比,执行效率将提高许
多。
一般来说,前台浏览器的请求(Request)可能同时发生,因此,
ISAPI 的DLL 必须是个线程安全的DLL 。还有一点要提及的,CGI是
利用Standard I/O(标准输出/输入) 和操作系统环境变量(
Environment Variable)与Web 服务器通信的(顺便提一下,Delphi
5.0下做的通信程序,在Delphi 6.0 下不能直接使用)。而ISAPI是
通过扩展控制块ECB(Extension Control Blocks)完成相同的操作
的。


第三节 利用Internet控件设计动态网页

1) file->Mew ->other->new->Web Server Application
对话框选 CGI。OK 自动产生一个空的TWebModeule。
2) 在Web 服务器上,不需要Form,但可以在这个TWebModeule上
放置相应的控件。除此以外,TWebModeule还担负着Web 服务器和CGI
程序之间的信息传递桥梁作用。
3) 每个TWebModeule 上可以建立一至多个ActionItem(动作项目
),每个ActionItem可以根据前台送来的Requset (请求)作适当的处
理,然后产生HTML的响应返回前台。



第三节 利用Internet控件设计动态网页


这里所说的动态网页,指的是一种互动的网页,但数据库的显示还是
“静态”的。这和下一章要说的利用java和XML 技术形成一种动态的数据
库显示不同。

1) file->Mew ->other->new->Web Server Applicationx

2) 对话框选 CGI。OK

3) 自动产生一个空的TWebModeule。

在Web 服务器上,不需要Form,但可以在这个TWebModeule上放置相应
的控件。除此以外,TWebModeule 还担负着Web 服务器和CGI程序之间的信
息传递桥梁作用。

4) 每个TWebModeule 上可以建立一至多个ActionItem(动作项目),每个
ActionItem可以根据前台送来的Requset (请求)作适当的处理,然后产生
HTML的响应返回前台。举个例子:

在WebModule1上放两个控件:

(ADO页) -> ADOTable1
(Internet页)-> DataSetTableProducer1

ADOTable1用于连接数据库,DataSetTableProducer1用于把数据源的数
据转换成HTML标记语言。

用普通方法把ADOtable连接上数据库;
DataSetTableProducer1的属性:
Dataset=ADOTable1。
你可以用属性Columns(栏目)看到前台浏览器转换的结果。


5) 选取WebModule1的Action属性(也可以双击窗口),打开ActionItem编
辑窗口,单击Add图标
添加一个WebActionItem1

设置ActionItem的属性:
Default=true (缺省)
Enable=true

6) 选择ActionItem的OnAction事件函数,加入如下语句:

procedure TWebModule1.WebModule1WebActionItem1Action(Sender: TObject;
Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
begin
//这是自己加的
Response.Content:=DataSetTableProducer1.Content;
end;

表示把DataSetTableProducer1传出来的HTML数据指定给ActionItem相应参
数。DataSetTableProducer1.Content就是HTML数据,这些数据必须指定给
Response.Content才能让WebModule1传给前台浏览器。

7) 把program 的名字改为Inter1,保存(注意工程名改为PInter1),编译。
8) 把编译好的EXE 文件拷贝到虚拟目录下(这里为CGI),然后用IE浏览器用
如下URL调用:
http://127.0.0.1/cgi/inter1.exe
我们可以看到数据已经可以在浏览器上显示了:

9) 下面对表格进行装饰:

DataSetTableProducer1,属性:
Columns(栏目)看前台浏览器转换的结果


打开Editing DataSetTableProducer1.Columns 对话框。

首先删除不需要显示的字段;
Border=1 显示框线;
Bgcolor 选择背景色;
然后选中所有字段,属性:
Bgcolor 单元格底色;
Title 标题栏的装饰




再点DataSetTableProducer1,属性:
Header:表格以上的HTML语句;
Footer:表格以下的HTML语句;
MaxRows:表格行数。

比如,我们在Header属性中加入:
<h2 align=center>这是我的第一个表格</h2>
<hr>
可以看看效果。



 
谢谢xzh2000提供这么详细的步骤,但是我想问的是为什么CGI程序在我的电脑上可以执行,
而在其它的电脑上却不能。
 
CGI程序有什么系统注册信息吗?
 
我好像什么也没改,现在又可以了,结贴。
 
后退
顶部