次の方法で共有


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 では、明示的または黙示的な保証なしで、例示のみのプログラミング例を提供しています。 これには、商品性または特定の目的への適合性に関する黙示的な保証が含まれますが、これらに限定されません。 この記事では、デモンストレーションされているプログラミング言語と、プロシージャの作成とデバッグに使用されるツールについて理解していることを前提としています。 Microsoft サポート エンジニアは、特定のプロシージャの機能を説明するのに役立ちますが、これらの例を変更して追加の機能を提供したり、特定の要件を満たすプロシージャを構築したりすることはできません。

環境変数の取得

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

VALUE = Environ$(NAME)

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

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

Win32 ReadFile関数を使用してSTDINから読み取り、WriteFileに書き込むSTDOUT関数を使用します。 これらの関数には、STDINまたはSTDOUTへのハンドルを提供する必要があります。 GetStdHandle関数を使用することで、STDINSTDOUTのハンドルを取得することができます。 この記事では、関数呼び出しを簡略化するために、 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 (Test.htm) をテストするための HTML フォーム

<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 エンコードが使用され、すべてのスペースが + に変換され、!などの特殊文字がすべて使用されます。 は、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 デバッガーで実行できます。

References