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 Textverarbeitungsfunktionen der Programmiersprache Visual Basic möchten viele Webentwickler CGI-Programme in Visual Basic schreiben. Dieser Artikel veranschaulicht die Techniken zum Schreiben von CGI-Anwendungen in Visual Basic und enthält ein einfaches Visual Basic-CGI-Beispiel.
Weitere Informationen
Hinweis
Die Verwendung der hier aufgeführten Informationen, Makro- oder Programmcodes geschieht auf Ihre eigene Verantwortung. Microsoft stellt Ihnen diese Informationen sowie Makro- und Programmlistings ohne Gewähr auf Richtigkeit, Vollständigkeit und/oder Funktionsfähigkeit sowie ohne Anspruch auf Support zur Verfügung. Die zur Verfügung gestellten Makro- und Programmierungsbeispiele sollen lediglich exemplarisch die Funktionsweise des Beispiels aufzeigen. Die Microsoft Support-Spezialisten können bei der Erläuterung der Funktionalität bestimmter Prozeduren helfen, jedoch werden sie diese Beispiele nicht in Bezug auf eine erweiterte Funktionalität verändern, noch werden sie Prozeduren entwickeln, die auf Ihre besonderen Bedürfnisse zugeschnitten sind.
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. Sein Wert wird in VALUE
zurückgegeben.
Lesen aus STDIN und Schreiben in STDOUT
Verwenden Sie die Win32-Funktion ReadFile
zum Lesen aus STDIN
und die WriteFile
Funktion zum Schreiben in STDOUT
. Für diese Funktionen müssen Sie ein Handle für STDIN
oder STDOUT
bereitstellen. Sie können die GetStdHandle
-Funktion verwenden, um die Handles für oder STDOUT
abzurufenSTDIN
. 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 konstanten, die an die GetStdHandle
Funktion übergeben werden, werden wie folgt definiert:
Public Const STD_INPUT_HANDLE = -10&
Public Const STD_OUTPUT_HANDLE = -11&
Die Definition der einzelnen Parameter in diesen Funktionen finden Sie in der MSDN-Dokumentation. Im folgenden Beispiel wird eine vollständige Liste der CGI-Umgebungsvariablen als konstant festgelegt. Dadurch werden alle Konstanten zusammen auf einem STRG-J-Element aufgelistet. Außerdem werden Programmierfehler durch die Bereitstellung von Compiler- und IntelliSense-Überprüfungen beseitigt, es wird jedoch nicht ausgeschlossen, dass Sie eigene Zeichenfolgen eingeben.
Beispielcode
Der Einfachheit halber wird das Abfangen von Fehlern im folgenden Beispiel (Hello.bas) ausgelassen:
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 des 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:
Erstellen Sie ein neues Projekt als Standardprojekt .exe.
Entfernen Sie Formular aus dem Projekt.
Fügen Sie dem Projekt ein Modul hinzu, und nennen Sie es HELLO.
Legen Sie
Sub Main
als Startobjekt fest (unter Projekteigenschaften).Kopieren Sie den obigen Visual Basic-Code, und fügen Sie ihn in das Modul ein.
Machen 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 UmgebungsvariableQUERY_STRING
abrufen. DieQUERY_STRING
Variable enthält Name-Wert-Paare, die durch die & im FormatName=Joe&Color=Red
getrennt sind. Url-Codierung wird verwendet, alle Leerzeichen werden in + konvertiert, und alle Sonderzeichen wie ! werden in ihre HEX-ASCII-Werte konvertiert. Anders ausgedrückt: 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 Formulare, Steuerelemente und Meldungsfelder für visuelle Schnittstellen völlig bedeutungslos. Tatsächlich bewirkt ein Meldungsfeld, dass eine CGI-Anwendung nicht mehr reagiert.
Die Fehlerbehandlung sollte in einem CGI-Code in Visual Basic durchgeführt werden, damit 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 in Visual Basic geschriebene Anwendungen debuggen. Daher können Sie die CGI-Debugtechniken verwenden, auf die unten verwiesen wird. Um eine Visual Basic-Anwendung mit Visual C zu debuggen, wählen Sie In nativen Code kompilieren aus, und wählen Sie dann Symbolische Debuginformationen erstellen und Keine Optimierung aus. Wenn sie abgeschlossen ist und die .exe generiert wird, kann Visual C an die ausgeführte CGI-Anwendung anfügen, die in Visual Basic geschrieben wurde.
Um eine CGI-Anwendung zu testen, kopieren Sie sie in das virtuelle IIS-Verzeichnis mit den Berechtigungen "Ausführen".
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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für