Freigeben über


Schreiben von CGI-Anwendungen in Visual Basic

In diesem Artikel wird beschrieben, wie CGI-Anwendungen geschrieben werden.

Ursprüngliche Produktversion: Visual Basic
Ursprüngliche KB-Nummer: 239588

Zusammenfassung

Eine CGI-Anwendung (Common Gateway Interface) kann in jeder Programmiersprache geschrieben werden, die sowohl auf die Umgebungsvariablen als auch auf STDIN oder STDOUT zugreifen kann. Aufgrund der leistungsstarken Textverarbeitungsfunktion der Visual Basic-Programmiersprache möchten viele Webentwickler CGI-Programme in Visual Basic schreiben. In diesem Artikel werden die Techniken zum Schreiben von CGI-Anwendungen in Visual Basic veranschaulicht und ein einfaches Visual Basic CGI-Beispiel bereitgestellt.

Mehr Informationen

Hinweis

Microsoft stellt Programmierbeispiele nur zu Illustrationszwecken bereit, ohne ausdrückliche oder stillschweigende Gewährleistung. Dazu zählen, ohne darauf beschränkt zu sein, die stillschweigenden Garantien der Marktgängigkeit oder Eignung für einen bestimmten Zweck. In diesem Artikel wird davon ausgegangen, dass Sie mit der programmiersprache vertraut sind, die demonstriert wird, und mit den Tools, die zum Erstellen und Debuggen von Prozeduren verwendet werden. Microsoft-Supporttechniker können dabei helfen, die Funktionalität eines bestimmten Verfahrens zu erläutern, aber sie ändern diese Beispiele nicht, um zusätzliche Funktionen bereitzustellen oder Verfahren zu erstellen, um Ihre spezifischen Anforderungen zu erfüllen.

Abrufen von Umgebungsvariablen

Verwenden Sie die Environ$ Funktion in Visual Basic wie folgt, um eine Umgebungsvariable abzurufen:

VALUE = Environ$(NAME)

Hinweis

NAME ist die Umgebungsvariable, die Sie abrufen möchten. Der Wert wird in VALUE.

Lesen von STDIN und Schreiben in STDOUT

Verwenden Sie die Win32-Funktion ReadFile zum Lesen aus STDIN und die WriteFile Funktion zum Schreiben in STDOUT. Diese Funktionen erfordern, dass Sie ein Handle für STDIN oder STDOUT bereitstellen. Sie können die GetStdHandle Funktion verwenden, um die Handles zu STDIN oder STDOUT abzurufen. In diesem Artikel wird aliasing für die GetStdHandle Funktion verwendet, um die Funktionsaufrufe zu vereinfachen. Die Deklarationen für diese Funktionen sind wie folgt:

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

Die an die GetStdHandle Funktion übergebenen Konstanten werden wie folgt definiert:

Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&

In der MSDN-Dokumentation finden Sie die Definition der einzelnen Parameter in diesen Funktionen. Im folgenden Beispiel wird eine vollständige Liste der CGI-Umgebungsvariablen konstant gemacht. Dadurch werden alle Konstanten durch Drücken von Strg+J aufgelistet. Außerdem werden Programmierfehler durch die Bereitstellung der Compiler- und IntelliSense-Validierung beseitigt, dennoch können Sie weiterhin Ihre eigenen Zeichenfolgen eingeben.

Beispielcode

Aus Gründen der Einfachheit wird die Fehlerfangung im folgenden Beispiel nicht angegeben (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-Formular zum Testen der 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>

Schritte zum Erstellen der CGI-Hello.exe-Datei:

  1. Erstellen Sie ein neues Projekt als Standard-.exe-Projekt.

  2. Formular aus dem Projekt entfernen.

  3. Fügen Sie dem Projekt ein Modul hinzu, und nennen Sie es HELLO.

  4. Setzen Sie Sub Main als Startobjekt (unter Projekteigenschaften) fest.

  5. Kopieren Sie den obigen Visual Basic-Code, und fügen Sie ihn in das Modul ein.

  6. Erstellen Sie Hello.exe.

    Hinweis

    • Der Beispielcode veranschaulicht, wie eine HTTP-Anforderung POST behandelt wird. Um eine GET-Anforderung zu verarbeiten, muss die CGI-Anwendung die QUERY_STRING Umgebungsvariable abrufen. Die QUERY_STRING Variable enthält Name/Wert-Paare, die durch das & im Format Name=Joe&Color=Redgetrennt sind. Die URL-Codierung wird verwendet, alle Leerzeichen werden in + konvertiert, und alle Sonderzeichen wie ! werden in ihre HEX ASCII-Werte konvertiert. Mit anderen Worten: Die Zeichenfolge "Hello, World!" wird als "Hello,+World%21" dargestellt. Visual Basic CGI-Anwendungen müssen den gesamten Analysecode implementieren.

    • Da die CGI-Anwendung vom Dienst gestartet wird, kann sie möglicherweise nicht auf Netzwerkfreigaben zugreifen.

    • Beachten Sie, dass CGI als Dienst ausgeführt wird, der mit dem Server kommuniziert. Daher sind visuelle Schnittstellenformulare, Steuerelemente und Meldungsfelder völlig bedeutungslos. Tatsächlich führt ein Meldungsfeld dazu, dass eine CGI-Anwendung nicht mehr reagiert.

    • Fehlerbehandlung sollte in einem CGI-Code in Visual Basic durchgeführt werden, sodass das Standardfehlermeldungsfeld nicht angezeigt wird. Sie können entweder Fehlermeldungen auf dem Server protokollieren oder in den Browser des Benutzers schreiben.

    • Visual C-Debugger können Anwendungen debuggen, die in Visual Basic geschrieben wurden. Daher können Sie die unten referenzierten CGI-Debuggingtechniken verwenden. Um eine Visual Basic-Anwendung mit Visual C zu debuggen, wählen Sie "In systemeigenem Code kompilieren" aus, und wählen Sie dann "Symbolische Debuginformationen erstellen" und "Keine Optimierung" aus. Wenn der Vorgang abgeschlossen ist und die .exe generiert wird, kann Visual C an die laufende, in Visual Basic geschriebene CGI-Anwendung anhängen.

    • Um eine CGI-Anwendung zu testen, kopieren Sie sie mit "Ausführen"-Berechtigungen in das virtuelle IIS-Verzeichnis.

    • Beachten Sie, dass Laufzeitfehler oder Dialogfelder im Visual Basic-Code dazu führen können, dass die CGI-Anwendung nicht mehr reagiert. Wenn die CGI-Anwendung nicht mehr reagiert, kann sie im Visual Studio-Debugger ausgeführt werden.

References