delphi与internet2
这篇文章主要讲述如何使delphi和因特网配合工作。本文中将详述两个专门技术:
wininet:构建 ftp,http 和 gopher 用户端程序 isapi:扩充因特网信息服务,例如,获得服务器上的信息并把它们显示在浏览器上。
现今的计算机世界中,由于微软公司的因特网战略而掀起了一个巨大发展潮流。那些制作
cgi(公共网关接口)和第三方工具(即使是最基本的因特网工具)的日子将最终一去不复返了。对复杂的第三方工具的需求总是存在的,但现在程序员将会发现他们所需的大量的嵌入操作系统的因特网工具,简言之,并不需要进一步的投资,你就能够使用免费的delphi资源来:
*开发 web 浏览器
*运行 ftp,http 和 gopher ,在两个delphi应用软件之间或delphi应用软件和基于tcp
(传输控制协议)的服务器之间操作tcp
因为delphi能够轻松地调用windows api,并且它支持ocx/activex,因此微软的新战
略和我们的计划配合的恰到好处。微软生产工具,而delphi程序员获得收成!
在本篇中有些什么?
这篇文章中包含了三个大部分和一些小部分,有三个大主题:
*寻找资料:那里能搞到本文中提及的技术资料,而且包含了关于您所需的运行文中代码 的软硬件的简短说明。
*isapi:怎样使用isapi
*wininet:怎样使用wininet
在大多数情况下,本文中的isapi和wininet部分是完全独立的,您可以自由地选择阅读时的顺序。
查找资料,硬件和软件的要求
您需要一份microsoft windows nt 3.51 server 或 nt 4.0 server 的拷贝,其中应附有因特网信息服务文档,因为您需要甬道其中所提到的技术。这份文档应随nt server4.0 附送,nt 3.51的用户可从微软的网址上下载。运行windows nt,您的机器的最低配置应为486兼容,20兆以上内存。
您必须有另一台计算机装有网页浏览器。为使本文中的isapi部分能够顺利运行,第二台
机器必须能够运行所有支持网页浏览器的软件。如果在您的机器上运行的是windows 95 或 windows nt
那么本文中的wininet 代码片就能运行的最好。任何符合条件的网页浏览器在这种技术环境下都能够使用。
在1996年六月以后发布的delphi2.0以上的版本中,有您所需的把delphi连接到因特网上
的几乎全部资源。
如果您没有最新的delphi版本[注:此处作者指的是2.0版本(译者)],那么您需要本文
档中提到的特殊文件,所有这些几乎都可以从万维网上免费获得[注:如果您正在使用delphi2.0以上版本,则不许考虑(译者)]。所有本文中提到的技术在delphi2.0环境下都能顺利工作,但在16位delphi环境下则不一定能顺利工作。
如果您需要从万维网上下载信息,链接为:http://www.borland.com/techinfo/delphi/i
ndex.html
[注:现在已经不存在了!:-(( (译者)]
delphi2.0的新版本中附有 wininet.pas 文档,如果你的拷贝中不包含它,那么上面那个
万维网节点可以为您提供。wininet.pas包括为扩展微软视窗因特网所设计的变量清单、函数、类型和属性。这意味着您能够轻而易举地为您的应用程序增添ftp、http和gopher支持。微软公司的wininet.dll是免费发布的,如果它不在您的windows/system 或windows/system32 目录下的话,您可以从微软公司那里得到它。下面是可获得wininet.h这个视窗帮助文件的万维网节点:
http://www.microsoft.com/intdev/sdk/docs/wininet/default.htm [注:好象也没了!: -( (译者)]
一般来说,微软因特网开发者的网上之家是微软节点的 intdev 部分。
除了wininet和icp之外,另一个为delphi支持的关键技术就是isap。正如微软公司文档中
所描述的,这项技术能使您“‘写入’服务器端的原本和过滤本,从而扩充微软因特网信息服务和其他isapi万维网服务”。
如果您需要找到关于isapi的描述,可以去:
http://www.microsoft.com/intdev/sdk/servapi.htm [注:上帝保佑您!;-) (译者)]
在本文最后,附加了一个名为httpext.pas的关键的isapi文档的拷贝。
微软公司免费发布的因特网控制包(icp)是一个ocx/activex控制集,您可以在delphi中
把它们拖放到应用程序上(delphi2.0中包含这些控件)。他们提供了创建delphi应用程序的即时支持,他们知道如何浏览网页、 如何应用ftp、winsock和其他因特网技术。如果您的delphi拷贝中没有包含这些控件,那么您在使用它们之前您应该把这些文档添加进delphi所在的目录中的lib目录下。这些文档位于上面提及的链接中的borland的index.html站点下。在本文中我没有提到icp控件,但是任何对这项技术有兴趣的人应该明确确认他拥有这些
控件的拷贝。
您可以从我的站点下载我的pascal应用文件,他们的名字是strbox.pas 和 mathbox.pas 。
经常察看一下这个站点上的关于本文提到的信息的更新情况是很有好处的。
在这里我假设读者对于delphi和object pascal都很熟悉,并且读者对于因特网,html,
浏览器和万维网服务器有基本的了解。
isapi
isapi是一项很容易使用然而功能强大的技术,它能够让您扩充因特网信息服务的功能。
这项技术随windowsnt 4.0附送,让您在您的服务器上建立web、ftp和gopher站点。同时这项技术与windowsnt3.51 server[注:指服务器版本,另一个版本是工作站版本(译者)]兼容。
在过去,扩充网页服务器的最佳办法是建立cgi应用程序。它们是强有力的工具,但是也
被他们的执行格式所限制[注:如perl是解释执行的(译者)]。当您从浏览其上发出一个基于cgi的请求到服务器上时,这个cgi 应用程序将极有可能先被强制装入内存中,这会消耗很多时间。而且,在某些环境下, cgi技术显得稍微难用了一点。
isapi是一种通过写入dlls[注:动态链结程序(译者)]从而替代cgi应用的方法。您也可
以通过isapi来写过滤文本,但这项技术我不会在本篇中提及。同cgi相比,isapi更容易使用,而且它更快,同时能更好地利用系统资源。在下面几点中,我将详细地介绍为什么isapi dlls比cgi应用要更为出色:
isapi dlls与http服务位于相同的地址,因此他们能够从服务器上直接存取http服务。与cgi应用相比,它们 能更快地装入内存;当他们在服务器上发出请求时,所需的停悬的时间[注:指发出请求到接受服务器应答的时间(译者)]要少的多。这点当服务器的负荷很重时更加重要。
您可以控制dlls何时被装载和卸载。例如:您可以在第一次尝试请求时预先装载dlls;当
它们不被使用时卸载 这个isapi应用dlls以便释放系统资源。
正如前文所述,您可以利用isapi写过滤文本[注:一般指c/s结构中的脚本(译者)],更
具微软的文档,您可以通过isapi过滤文本做下面这些事情:
用户授权方案
压缩
加密
登入
通信分析或其他请求分析(例如,寻找 "..\..\etc\password" 中的请求)
在本文中,我会着重介绍如何编写返回数据集的dlls,或者是如何与运行浏览器的用户进
行简单的联系。
isapi 基础
httpext.pas文件包含了使用isapi的关键声明。这个文件应随1996年6月以后发表的
delphi版本分发。它也可以在borland的站点上找到,在本文的isapi部分附有这份文档。因为这是基于nt的技术, 您必须使用delphi2.0以上的版本来应用这项技术。您不可能在16位的编辑器上应用它。
httpext.pas包含了微软公司创立的isapi技术的接口[注:指delphi接口,isapi由c++编
写(译者)]。在编写delphi的时候并没有提供isapi的用户接口,我会仅仅就如何使用微软公司的现有技术进行描述。不过,isapi 太容易使用了,而且对大多数用户来说,用户的delphi对象的版本并不是必须的。
有三个函数可作为isapi dlls的入口,前两个是必须的,第三个时可选的。
getextensionversion: 进对最低版本做检查
httpextensionproc: 这是dll的入口,就象是delphi应用程序中的 begin...end 块
terminateextension: 这是个可选的程序,它可以用作清除其他内存分配的线程。
当您在创建isapi dll的时候,您必须引用上面列出的三个函数中的头两个函数,执行这
两个函数是所有isapi编程的关键。
这三个语句都包含了“字输出”,使用这项术语是因为isapi dlls扩充了因特网信息服务
器。(记住,因特网信息服务器指的是微软服务器。如果您要把一台nt服务器作为体格网页服务器的话,那么,这正是您所需的工具。isapi dlls随nt4.0分发,在安装操作系统是自动安装。)
isapi提供了一个制作服务器可遵循的标准。例如,它可以把网景公司的复杂的nsapi接口
压缩至相关的简练而优美的isapi来对nsapi接口进行操作。
下面是这两个重要函数的声明
function getextensionversion(var ver: thse_version_info): bool; stdcall;
function httpextensionproc(var ecb: textensioncontrolblock): dword; stdcall;