用VB开发标准CGI程序

文章作者 100test 发表时间 2008:01:04 13:36:01
来源 100Test.Com百考试题网


虽然目前已经有很多可以取代CGI且性能较CGI要高的技术(例如ASP、ISAPI、NSAPI等),但使用它们需要用到专门的知识和工具,并且利用这些技术所编制的程序也只适用于特定的Web服务器或系统平台。考虑到CGI程序的易用易学性、跨服务器平台特性等优点,CGI程序还将在WWW上占有一一席之地。本文将介绍如何用VB编写标准的CGI程序,最后本文还用VB实现了一个有关主页客户留言簿的CGI程序。

  利用通用网关接口CGI,WEB服务器可以执行一些外部程序,可以将这些外部程序所产生的输出结果和WEB服务器所管理的静态文本、图象和声音融合在一起传给相应的WEB浏览器。当客户方的浏览器向WEB服务器请求一个HTML文件时,服务器在收到请求后就去寻找这个文件并将找到的文件传送给客户方。而当客户方的请求是一个CGI程序时,WEB服务器将激活客户方所请求的CGI程序并把程序的执行结果传给客户方。

  标准的CGI程序是通过环境变量和标准输入输出和WEB服务器交换信息的。任何一个被系统激活的进程都拥有标准输入和输出这两个文件句柄,CGI程序的进程也不例外。不过当CGI程序被WEB服务器激活以后,它的标准输入STDIN被连接到WEB服务器的标准输出STDOUT上,而CGI程序的标准输出STDOUT则被连到服务器的标准输入STDIN上。因此CGI程序从标准输入读取信息也就是从WEB服务器的标准输出读信息,而它向标准输出写信息也就是向WEB服务器的标准输入写信息。

  WEB服务器一般将客户方传送来的信息放在它的标准输出和相关环境变量中,而CGI程序则从环境变量和它的标准输入(也就是WEB服务器的标准输出)获取所需的信息,程序的最终输出结果则被写向它的标准输出STDOUT(也就是WEB服务器的标准输入)。WEB服务器将从它的标准输入STDIN(也就是CGI程序的标准输出)获取CGI程序的输出结果并将它传送给客户方。客户方、WEB服务器和CGI程序之间的信息交流如图1所示,显然,WEB服务器就象是客户方和CGI程序间的中介人。

  WEB服务器、CGI程序间的这种标准框架在UNIX系统下和微软视窗环境中的字符方式下可以工作得非常好,因为此时系统所产生的所有进程都可以存取标准输入和标准输出。但对于微软视窗环境图形方式下的程序就不行了,这是由于它们无法存取标准输入和标准输出。为了解决这一问题,微软在Win32系统中创建了另一类型的标准输入和标准输出,程序可以通过调用Win32 API函数存取标准输入和标准输出,不过这就意味着使用这类标准输入和标准输出的CGI程序都必须是32位的。

  微软视窗环境下的其它一些WEB服务器(例如Website)则使用另外一种特殊的技术即利用INI文件来实现WEB服务器和CGI程序间的数据交流。采用这种被称为Win-CGI规范编写的CGI程序通常只能在部分WEB服务器上运行。一般支持Win-CGI的WEB服务器将客户端的输入和有关的状态信息写入一个INI文件中,而CGI程序则从该INI文件获取相关信息,这类程序的执行效率将没有标准CGI程序高。

  在进行CGI编程时,您只要使CGI程序从标准输入和环境变量中获取客户方提供的信息,把要传送给客户方的输出结果写入标准输出,剩下的信息传递工作WEB服务器将自动完成。通用网关接口CGI只是规定了一个标准的接口规范,只要遵守这个标准规范,程序开发人员可以利用各种编程工具例如Perl、C、Fortran、Visual Basic等进行CGI编程。考虑到Visual Basic的强大的数据库处理能力、客户服务器模式的编程能力以及字符串处理能力,本文将介绍如何用VB编写标准的CGI程序。

  一. 输入输出的处理

  一个CGI程序被激活以后,它首先要做的事情就是确定系统平台、WEB服务器和客户端浏览器的状态信息、客户端用户的输入数据,最后它还必须将相关信息能传送给客户端,否则它将一事无成。这些操作都是通过存取环境变量和标准输入输出完成的。用VB编写的CGI程序可以通过调用函数Environ( )来获取相关环境变量的值。存取标准输入输出就要在程序中使用Win32API函数GetStdHandle( )、ReadFile( )和WriteFile( ),在使用这些函数时首先必须在程序中声明它们。

  以下的CGI程序说明了在VB-CGI程序中如何处理环境变量和标准输入输出,该CGI程序非常简单,可以将标准输入中的信息不经任何处理就返回给客户端,它可以被任何表单用POST方法激活:

   Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long

  Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, _

   ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, _

   lpOverlapped As Any) As Long

   Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, ByVal lpBuffer As String, _

   ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, _

   lpOverlapped As Any) As Long

   Public Const STD_INPUT_HANDLE = -10&.

   Public Const STD_OUTPUT_HANDLE = -11&.

   Public Const FILE_BEGIN = 0&.

   Public hStdIn As Long ’ 标准输入文件句柄

   Public hStdOut As Long ’ 标准输出文件句柄

   Sub Main()

   Dim CGI_ContentLength As String,CGI_QueryString As String

   Dim lContentLength As Long ’ 标准输入中的字符串的长度

   Dim sBuff As String ’ 用于存储标准输入中的字符串

   Dim lBytesRead As Long ’ 实际读入的字符个数

   Dim rc As Long

   Dim sFormData As String

   ’调用系统函数生成标准输入输出文件句柄

   hStdIn = GetStdHandle(STD_INPUT_HANDLE)

   hStdOut = GetStdHandle(STD_OUTPUT_HANDLE)

   ’获取环境变量CONTENT_LENGTH的值,并将它转换为整型

   CGI_ContentLength = Environ("CONTENT_LENGTH")

   lContentLength = Val(CGI_ContentLength)

   sBuff = String(lContentLength, Chr$(0))

   ’从标准输入中读数据

   rc = ReadFile(hStdIn, ByVal sBuff, lContentLength, lBytesRead, ByVal 0&.)

   sFormData = Left$(sBuff, lBytesRead)

   OutPut "Content-type: text/html" &. vbCrLf

   OutPut "〈HTML〉〈HEAD〉"

   OutPut "〈TITLE〉表单传送数据的方法POST 〈/TITLE〉〈/HEAD〉"

   OutPut "〈BODY〉〈H3〉表单传送数据的方法POST〈/H3〉 "

   OutPut "〈P〉本CGI 程序由Visual Basic编制! "

   OutPut "〈P〉POST方法传送的数据: "

   OutPut "〈P〉" &. sBuff

   OutPut "〈/BODY〉〈/HTML〉"

   End Sub

   Sub OutPut(s As String) ’ 定义一个向标准输出写信息的函数

   Dim lBytesWritten As Long

   s = s &. vbCrLf

   WriteFile hStdOut, s, Len(s), lBytesWritten, ByVal 0&.

   End Sub

相关文章


用VB创建自己的通信程序
用VB开发标准CGI程序
怎样用VB得知系统当前是否处于internet链结状态
简单电子邮件发送程序
在VB中用Outlook发电子邮件
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛