Visual Basic で CGI アプリケーションを記述する

この記事では、CGI アプリケーションを記述する方法について説明します。

元の製品バージョン: Visual Basic
元の KB 番号: 239588

概要

Common Gateway Interface (CGI) アプリケーションは、環境変数と STDIN または STDOUT の両方にアクセスできる任意のプログラミング言語で記述できます。 Visual Basic プログラミング言語の強力なテキスト処理機能により、多くの Web 開発者は Visual Basic で CGI プログラムを記述したいと考えています。 この記事では、Visual Basic で CGI アプリケーションを記述するための手法を示し、単純な Visual Basic CGI サンプルを提供します。

詳細

注:

Microsoft は、例示のみを目的としてプログラミング例を提供しており、明示または黙示にかかわらず、いかなる責任も負わないものとします。 これには、市販性または特定の目的との適合性についての黙示の保証も含まれますが、これに限定はされません。 この記事は、説明されているプログラミング言語、手順を作成およびデバッグするために使用されているツールに読者が精通していることを前提にしています。 マイクロソフト サポート窓口では、特定のプロシージャの機能説明に関するご質問に対して支援いたしますが、本例を特定の目的を満たすために機能を追加したり、プロシージャを構築することは行いません。

環境変数の取得

環境変数を取得するには、次のように Visual Basic で 関数を Environ$ 使用します。

VALUE = Environ$(NAME)

注:

NAME は、取得する環境変数です。 その値は で VALUE返されます。

STDIN からの読み取りと STDOUT への書き込み

Win32 ReadFile 関数を使用して から STDIN 読み取り、 に WriteFile 書き込む関数を使用します STDOUT。 これらの関数では、 または STDOUTへのハンドルを指定するSTDIN必要があります。 関数をGetStdHandle使用して、 または STDOUTにハンドルを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

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 ファイルをビルドする手順:

  1. 標準の .exe プロジェクトとして新しいプロジェクトを作成します。

  2. プロジェクトからフォームを削除します。

  3. プロジェクトにモジュールを追加し、HELLO という名前を付 けます

  4. スタートアップ オブジェクトとして設定 Sub Main します ([プロジェクトのプロパティ] の下)。

  5. 上記の Visual Basic コードをコピーし、モジュールに貼り付けます。

  6. Hello.exe します。

    注:

    • サンプル コードは、HTTP POST 要求を処理する方法を示しています。 GET 要求を処理するには、CGI アプリケーションで環境変数を取得する QUERY_STRING 必要があります。 変数には QUERY_STRING 、 形式 Name=Joe&Color=Redの & で区切られた名前と値のペアが含まれています。 URL エンコードが使用され、すべてのスペースが + に変換され、 などのすべての特殊文字が使用されます。 は HEX 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 デバッガーで実行できます。

関連情報