tempad
ReadyGo!技术成就梦想 >>VB教程 >> 用VB编写标准CGI程序(上)

用VB编写标准CGI程序(上)

ReadyGo!技术成就梦想 网络搜索 efish 2008-2-24 2:47:31
利用通用网关接口(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程序之间的信息交流如下图所示。显然 Web服务器就像是客户机和CGI程序间的中介。

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

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

  在进行CGI编程时 只要使CGI程序从标准输入和环境变量中获取客户机提供的信息 并将要传送给客户机的输出结果写入标准输出 剩下的信息传递工作将由Web服务器自动完成。CGI只是规定了一个标准的接口规范 只要遵守这个标准规范 程序开发人员就可以利用各种编程工具(如Perl C FORTRAN VisualBasic等)进行CGI编程了。考虑到VisualBasic的强大的数据库处理能力 客户机/服务器模式的编程能力以及字符串处理能力 所以本文主要向大家介绍如何使用VB编写标准的CGI程序。

  一 输入输出的处理

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

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

  DeclareFunctionGetStdHandleLib"kernel32"(ByValnStdHandleAsLong)AsLong

  DeclareFunctionReadFileLib"kernel32"(ByValhFileAsLong,lpBufferAsAny,

  ByValnNumberOfBytesToReadAsLong,lpNumberOfBytesReadAsLong,lpOverlappedAsAny)AsLong

  DeclareFunctionWriteFileLib"kernel32"(ByValhFileAsLong,ByVallpBufferAsString,ByValnNumberOfBytesToWriteAsLong,lpNumberOfBytesWrittenAsLong,lpOverlappedAsAny)AsLong

  PublicConstSTD_INPUT_HANDLE=-10&

  PublicConstSTD_OUTPUT_HANDLE=-11&

  PublicConstFILE_BEGIN=0&

  PublichStdInAsLong"标准输入文件句柄

  PublichStdOutAsLong"标准输出文件句柄



  SubMain()

  DimCGI_ContentLengthAsString CGI_QueryStringAsString

  DimlContentLengthAsLong"标准输入中的字符串的长度

  DimsBuffAsString"用于存储标准输入中的字符串

  DimlBytesReadAsLong"实际读入的字符个数

  DimrcAsLong

  DimsFormDataAsString

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

  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,ByValsBuff,lContentLength,lBytesRead,ByVal0&)

  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程序使用VisualBasic编制 "

  OutPut"<P>POST方法传送的数据:"

  OutPut"<P>"&sBuff

  OutPut"</BODY></HTML>"

  EndSub

  SubOutPut(sAsString)"定义一个向标准输出写信息的函数

  DimlBytesWrittenAsLong

  s=s&vbCrLf

  WriteFilehStdOut,s,Len(s),lBytesWritten,ByVal0&

  EndSub

  一般地 用VB编译生成的CGI程序不能正确处理中文信息。这主要表现在CGI程序向STDOUT输出的中文在Web页面上无法正确显示 可通过在该中文字符串后跟著输出一些空格来解决这个问题。当使用HTML标识符<P> </P>对Web

   

[1]  [2]  [3]  上一页  下一页
责任编辑: efish 参与评论 查找更多:
相关文章
用VB编写异步多线程下载程序 用VB编写异步多线程下载程序
跟我学做记事本 跟我学做记事本
制作带有动画和声音的屏幕保护程序 制作带有动画和声音的屏幕保护程序
基于Win95的VB5串口通信程序 基于Win95的VB5串口通信程序
用VisualBasic5.0设计E-mail程序(MAPI) 用VisualBasic5.0设计E-mail程序(MAPI)
VB从零开始编外挂(九) VB从零开始编外挂(九)
如何用VisualBasic编写小型的网络系统 如何用VisualBasic编写小型的网络系统
用VB6编写强力的windows隐藏引擎 用VB6编写强力的windows隐藏引擎
用WinSock设计Chat程序 用WinSock设计Chat程序
FSO对象模型在VB中的应用 FSO对象模型在VB中的应用
2秒记住本站域名

玩过泡泡龙吗?Readygo?Go! 再加上.Com.Cn的后缀,那就是大名小顶的ReadyGo.com.cn

分类导航
ReadyGo!技术成就梦想