この記事では、CGI アプリケーションを記述する方法について説明します。
元の製品バージョン: Visual Basic
元の KB 番号: 239588
まとめ
Common Gateway Interface (CGI) アプリケーションは、環境変数と STDIN または STDOUT の両方にアクセスできる任意のプログラミング言語で記述できます。 Visual Basic プログラミング言語の強力なテキスト処理機能により、多くの Web 開発者は Visual Basic で CGI プログラムを記述したいと考えています。 この記事では、Visual Basic で CGI アプリケーションを記述する方法について説明し、簡単な Visual Basic CGI サンプルを提供します。
詳細
Note
Microsoft は、例示のみを目的としてプログラミング例を提供しており、明示または黙示にかかわらず、いかなる責任も負わないものとします。 これには、市販性または特定の目的との適合性についての黙示の保証も含まれますが、これに限定はされません。 この記事は、説明されているプログラミング言語、手順を作成およびデバッグするために使用されているツールに読者が精通していることを前提にしています。 マイクロソフト サポート窓口では、特定のプロシージャの機能説明に関するご質問に対して支援いたしますが、本例を特定の目的を満たすために機能を追加したり、プロシージャを構築することは行いません。
環境変数の取得
環境変数を取得するには、Visual Basic で次のように Environ$
関数を使用します。
VALUE = Environ$(NAME)
Note
NAME は、取得する環境変数です。 その値は VALUE
で返されます。
STDIN からの読み取りと STDOUT への書き込み
Win32 ReadFile
関数を使用してSTDIN
から読み取り、STDOUT
に書き込むWriteFile
関数を使用します。 これらの関数では、 STDIN
または STDOUT
するハンドルを提供する必要があります。 GetStdHandle
関数を使用して、STDIN
またはSTDOUT
するハンドルを取得できます。 この記事では、関数呼び出しを簡略化するために、 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
CGI をテストするための HTML フォーム (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します。
Note
このサンプル コードは、HTTP
POST
要求を処理する方法を示しています。 GET 要求を処理するには、CGI アプリケーションでQUERY_STRING
環境変数を取得する必要があります。QUERY_STRING
変数には、Name=Joe&Color=Red
形式の > で区切られた名前と値のペアが含まれています。 URL エンコードが使用され、すべてのスペースが + に変換され、!などの特殊文字がすべて使用されます。 は、16 進 ASCII 値に変換されます。 つまり、"Hello, World!" 文字列は "Hello,+World%21" として表されます。Visual Basic CGI アプリケーションでは、すべての解析コードを実装する必要があります。CGI アプリケーションはサービスによって開始されるため、ネットワーク共有にアクセスできない可能性があります。
CGI はサービスとして実行され、サーバーと通信します。 したがって、ビジュアル インターフェイスのフォーム、コントロール、およびメッセージ ボックスは、まったく意味がありません。 実際には、メッセージ ボックスによって CGI アプリケーションが応答を停止します。
既定のエラー メッセージ ボックスが表示されないように、Visual Basic の CGI コード全体でエラー処理を実行する必要があります。 サーバーでエラー メッセージをログに記録するか、ユーザーのブラウザーに書き込むことができます。
Visual C デバッガーでは、Visual Basic で記述されたアプリケーションをデバッグできます。 そのため、以下に示す CGI デバッグ手法を使用できます。 Visual C を使用して Visual Basic アプリケーションをデバッグするには、[ネイティブ コードにコンパイル] を選択し、[シンボリック デバッグ情報の作成] と [最適化なし] を選択します。 完了し、.exeが生成されると、Visual C は Visual Basic で記述された実行中の CGI アプリケーションにアタッチできます。
CGI アプリケーションをテストするには、実行アクセス許可を持つ IIS 仮想ディレクトリにコピーします。
Visual Basic コードのランタイム エラーまたはダイアログ ボックスによって CGI アプリケーションが応答を停止する可能性があることに注意してください。 CGI アプリケーションが応答を停止した場合は、Visual Studio デバッガーで実行できます。