注意:Microsoft 提供的编程示例仅用于说明,没有任何明示或暗示的担保。这包括但不限于适销性或特定用途适用性的暗示担保。本文假定您熟悉所演示的编程语言和用于创建和调试过程的工具。Microsoft 的支持工程师可以帮助解释某个特定过程的功能,但是他们不会修改这些示例以提供额外的功能或构建过程以满足您的特定要求。
检索环境变量
若要检索环境变量,请使用那么 Environ$函数在 Visual Basic 中,如下所示:
请注意,名称是您要检索环境变量。在值中返回其值。
从标准输入中的读取和写入到标准输出
使用 Win32 ReadFile函数来读取标准输入和写文件函数写入到标准输出。这些功能要求您提供到 STDIN 或标准输出句柄。 可以使用GetStdHandle函数获取 STDIN 或标准输出句柄。 这篇文章,在别名用于GetStdHandle函数简化函数调用。这些函数的声明如下所示:
Public Declare Function stdin Lib "kernel32" Alias "GetStdHandle" _
(Optional ByVal Handletype As Long = STD_INPUT_HANDLE) As Long
Public Declare Function stdout Lib "kernel32" Alias "GetStdHandle" _
(Optional ByVal Handletype As Long = STD_OUTPUT_HANDLE) As Long
Public Declare Function ReadFile Lib "kernel32" _
(ByVal hFile As Long, ByVal lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, Optional ByVal lpOverlapped As Long = 0&) As Long
Public Declare Function WriteFile Lib "kernel32" _
(ByVal hFile As Long, ByVal lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, _
lpNumberOfBytesWritten As Long, Optional ByVal lpOverlapped As Long = 0&) As Long
传递给GetStdHandle函数的常数的定义如下:
Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&
请参考 MSDN 文档的这些函数中的每个参数的定义。在以下示例中,由常 CGI 环境变量的完整列表。这将列出在一起上 Ctrl J.所有常量此外通过提供编译器和 IntelliSense 验证,从而消除编程错误,但不会阻止您从您自己的字符串输入。
示例代码
为简单起见,省略了错误捕获,在下面的示例 (Hello.bas):
Option Explicit
Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&
Public Const CGI_AUTH_TYPE As String = "AUTH_TYPE"
Public Const CGI_CONTENT_LENGTH As String = "CONTENT_LENGTH"
Public Const CGI_CONTENT_TYPE As String = "CONTENT_TYPE"
Public Const CGI_GATEWAY_INTERFACE As String = "GATEWAY_INTERFACE"
Public Const CGI_HTTP_ACCEPT As String = "HTTP_ACCEPT"
Public Const CGI_HTTP_REFERER As String = "HTTP_REFERER"
Public Const CGI_HTTP_USER_AGENT As String = "HTTP_USER_AGENT"
Public Const CGI_PATH_INFO As String = "PATH_INFO"
Public Const CGI_PATH_TRANSLATED As String = "PATH_TRANSLATED"
Public Const CGI_QUERY_STRING As String = "QUERY_STRING"
Public Const CGI_REMOTE_ADDR As String = "REMOTE_ADDR"
Public Const CGI_REMOTE_HOST As String = "REMOTE_HOST"
Public Const CGI_REMOTE_USER As String = "REMOTE_USER"
Public Const CGI_REQUEST_METHOD As String = "REQUEST_METHOD"
Public Const CGI_SCRIPT_NAME As String = "SCRIPT_NAME"
Public Const CGI_SERVER_NAME As String = "SERVER_NAME"
Public Const CGI_SERVER_PORT As String = "SERVER_PORT"
Public Const CGI_SERVER_PROTOCOL As String = "SERVER_PROTOCOL"
Public Const CGI_SERVER_SOFTWARE As String = "SERVER_SOFTWARE"
Public Declare Function Sleep Lib "kernel32" _
(ByVal dwMilliseconds As Long) As Long
Public Declare Function stdin Lib "kernel32" Alias "GetStdHandle" _
(Optional ByVal Handletype As Long = STD_INPUT_HANDLE) As Long
Public Declare Function stdout Lib "kernel32" Alias "GetStdHandle" _
(Optional ByVal Handletype As Long = STD_OUTPUT_HANDLE) As Long
Public Declare Function ReadFile Lib "kernel32" _
(ByVal hFile As Long, ByVal lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, _
lpNumberOfBytesRead As Long, Optional ByVal lpOverlapped As Long = 0&) As Long
Public Declare Function WriteFile Lib "kernel32" _
(ByVal hFile As Long, ByVal lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, _
lpNumberOfBytesWritten As Long, Optional ByVal lpOverlapped As Long = 0&) As Long
Sub Main()
Dim sReadBuffer As String
Dim sWriteBuffer As String
Dim lBytesRead As Long
Dim lBytesWritten As Long
Dim hStdIn As Long
Dim hStdOut As Long
Dim iPos As Integer
' sleep for one minute so the debugger can attach and set a break
' point on line below
' Sleep 60000
sReadBuffer = String$(CLng(Environ$(CGI_CONTENT_LENGTH)), 0)
' Get STDIN handle
hStdIn = stdin()
' Read client's input
ReadFile hStdIn, sReadBuffer, Len(sReadBuffer), lBytesRead
' Find '=' in the name/value pair and parse the buffer
iPos = InStr(sReadBuffer, "=")
sReadBuffer = Mid$(sReadBuffer, iPos + 1)
' Construct and send response to the client
sWriteBuffer = "HTTP/1.0 200 OK" & vbCrLf & "Content-Type: text/html" & _
vbCrLf & vbCrLf & "Hello "
hStdOut = stdout()
WriteFile hStdOut, sWriteBuffer, Len(sWriteBuffer) + 1, lBytesWritten
WriteFile hStdOut, sReadBuffer, Len(sReadBuffer), lBytesWritten
End Sub
HTML 表单以测试 CGI (Test.htm)
<HTML>
<HEAD>
<TITLE>Testing VB CGI</TITLE>
</HEAD>
<BODY>
<FORM action="/cgi-bin/hello.exe" method="POST">
<INPUT TYPE="TEXT" NAME="Name"> Name<BR>
<INPUT TYPE="SUBMIT">
</FORM>
</BODY>
</HTML>
若要生成简单的 CGI Hello.exe 文件的步骤如下:
标准的.exe 项目创建一个新项目。
从项目中删除窗体。
将模块添加到该项目并将其命名为 HELLO。
设为启动对象 (在项目属性中) 的 Sub Main。
复制上面的 Visual Basic 代码并将其粘贴到模块。
使 Hello.exe。
注释:
该代码示例演示如何处理 HTTP POST 请求。若要处理一个 GET 请求,CGI 应用程序需要检索 QUERY_STRING 环境变量。QUERY_STRING 变量包含和格式由分隔的名称/值对"名称 = Joe 和颜色 = Red。"请注意,使用 URL 编码,所有的空格将被转换为+,如!的所有特殊字符会转换为其十六进制 ASCII 值。换句话说,将字符串"Hello,世界 !"表示为"Hello,+ 全球 21%。"Visual Basic CGI 应用程序必须实现所有分析的代码。
服务启动时的 CGI 应用程序,因为它可能不能访问网络共享。
请注意 CGI 运行作为一个服务,它与服务器进行通信。因此,视觉界面窗体、 控件和消息框是完全没有意义。事实上,消息框将导致一个 CGI 应用程序停止响应。
以便不会显示默认的错误消息框应该在 Visual Basic 中的 CGI 代码进行错误处理。可以在服务器上的错误消息记录,也可以将它们写到用户的浏览器。
Visual C 调试器可以调试在 Visual Basic 编写的应用程序。因此,您可以使用 CGI 调试下面提到的技术。调试与 Visual C Visual Basic 应用程序,选择将编译为本机代码,,然后选择创建符号调试信息并无优化。完成并生成.exe 时,Visual C 可以附加到运行 CGI 应用程序用 Visual Basic 编写的。
若要测试 CGI 应用程序,请将其复制到 IIS 虚拟目录的执行权限。
请注意,运行时错误或对话框中的 Visual Basic 代码可能导致 CGI 应用程序停止响应。 如果 CGI 应用程序停止响应,则可以在 Visual Studio 调试器中运行。的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章: