この記事では主に、DELPHI とインターネットを連携させる方法について説明します。この記事では、2 つの特殊なテクノロジーについて詳しく説明します。
WININET: FTP、HTTP、および Gopher クライアント プログラムを構築します。 ISAPI: サーバー上の情報を取得してブラウザ上に表示するなど、インターネット情報サービスを拡張します。
今日のコンピュータの世界では、マイクロソフトのインターネット戦略により、大きな発展傾向が始まっています。作っている人たち
最も基本的なインターネット ツールであっても、CGI (Common Gateway Interface) やサードパーティ ツールの時代はついに終わりました。洗練されたサードパーティ ツールの必要性は常にありますが、プログラマは、必要なインターネット ツールがオペレーティング システムに組み込まれているため、追加の投資を行わずに、次のような目的で無料の DELPHI リソースを使用できるようになります。
※WEBブラウザの開発
*2 つの DELPHI アプリケーション間、または DELPHI アプリケーションと TCP 間で FTP、HTTP、Gopher を実行します。
(Transmission Control Protocol) サーバー間で TCP を運用する
DELPHI は Windows API を簡単に呼び出すことができ、OCX/ActiveX をサポートしているため、Microsoft の新しい戦略
その戦略は私たちの計画と完全に一致しました。 Microsoft がツールを作成し、DELPHI プログラマーがその恩恵を受けています。
この記事の内容は何ですか?
この記事は 3 つの主要な部分といくつかの小さな部分で構成されており、次の 3 つの主要なテーマがあります。
*資料の検索: この記事で言及されている技術ドキュメントはそこから入手でき、この記事のコードを実行するために必要なハードウェアとソフトウェアの簡単な説明が含まれています。
※ISAPI:ISAPIの使い方
※WININET:WININETの使い方
ほとんどの場合、この記事の ISAPI セクションと WININET セクションは完全に独立しているため、読む順序は自由に選択できます。
情報、ハードウェアおよびソフトウェアの要件を見つける
そこに記載されているテクノロジを理解する必要があるため、Microsoft Windows NT 3.51 Server または NT 4.0 Server のコピーが必要になります。これらのドキュメントには、インターネット インフォメーション サービスのドキュメントが添付されている必要があります。このドキュメントは NT Server4.0 に含まれている必要があり、NT 3.51 のユーザーは Microsoft の Web サイトからダウンロードできます。 Windows NT を実行するには、マシンの最小構成が 486 互換で、20 MB 以上のメモリが必要です。
Web ブラウザがインストールされた別のコンピュータが必要です。この記事の ISAPI 部分をスムーズに実行するために、2 番目の
マシンは、Web ブラウザをサポートするすべてのソフトウェアを実行できる必要があります。マシンが Windows 95 または Windows NT を実行している場合
そうすれば、この記事の WININET コード部分が最適に動作します。この技術環境では、適格な Web ブラウザを使用できます。
1996 年 6 月以降にリリースされた Delphi 2.0 以降のバージョンには、Delphi をインターネットに接続するために必要なツールがあります。
ほぼすべてのリソース。
最新の Delphi バージョンをお持ちでない場合 [注: ここでの著者はバージョン 2.0 (翻訳者) を指します] 場合は、この記事が必要です
ファイル内で言及されている特殊ファイルは、すべて World Wide Web 上でほぼ無料で入手できます [注: Delphi2.0 以降を使用している場合は、(Translator) を考慮することはできません]。この記事で説明されているテクニックはすべて、Delphi2.0 環境ではスムーズに動作しますが、16 ビット Delphi 環境ではスムーズに動作しない可能性があります。
World Wide Web から情報をダウンロードする必要がある場合は、リンクは http://www.borland.com/TechInfo/delphi/i です。
インデックス.html
[注: もう存在しません。 :-(( (翻訳者)]
Delphi2.0 の新しいバージョンには WININET.PAS ドキュメントが付属しています。これが含まれていない場合は、上記のドキュメントを使用してください。
World Wide Web Node がこれを提供します。 WININET.PAS には、Microsoft Windows インターネットを拡張するために設計された変数、関数、型、およびプロパティのリストが含まれています。これは、FTP、HTTP、Gopher のサポートをアプリケーションに簡単に追加できることを意味します。 Microsoft の WININET.DLL は、Windows/System または Windows/System32 ディレクトリにない場合は、Microsoft から無料で配布されています。 WININET.H ウィンドウ ヘルプ ファイルが利用可能な World Wide Web ノードは次のとおりです。
http://www.microsoft.com/intdev/sdk/docs/wininet/default.htm [注: 現在は入手できなくなったようです。 : -( (翻訳者)]
一般に、Microsoft インターネット開発者のオンライン ホームは、Microsoft ノードの INTDEV 部分です。
WININET と ICP に加えて、Delphi でサポートされるもう 1 つの主要なテクノロジは ISAP です。 Microsoft の企業ドキュメントに記載されているとおり
説明したように、このテクノロジを使用すると、「サーバー側スクリプトとフィルタ スクリプトを「作成」し、それによって Microsoft インターネット インフォメーション サービスやその他の ISAPI Web サービスを拡張できる」ようになります。
ISAPI に関する説明を見つける必要がある場合は、次の場所にアクセスしてください。
http://www.microsoft.com/intdev/sdk/servapi.htm [注: 神のご加護がありますように! ;-) (翻訳者)]
この記事の最後に、HTTPEXT.PAS という名前の主要な ISAPI ドキュメントのコピーが添付されています。
Microsoft が無料でリリースした Internet Control Pack (ICP) は、Delphi で使用できる OCX/ActiveX コントロール セットです。
これらをアプリケーションにドラッグ アンド ドロップします (Delphi 2.0 にはこれらのコントロールが含まれています)。彼らは、Delphi アプリケーションの作成を即座にサポートし、Web の閲覧方法、FTP、WINSOCK、およびその他のインターネット テクノロジの使用方法を知っています。 Delphi のコピーにこれらのコントロールが含まれていない場合は、これらのドキュメントを使用する前に、Delphi が存在するディレクトリの Lib ディレクトリにこれらのドキュメントを追加する必要があります。ドキュメントは、上記のリンクにある Borland の INDEX.HTML サイトにあります。この記事では ICP コントロールについては触れていませんが、このテクノロジーに興味がある人は、これらのコントロールがあることを必ず確認する必要があります。
コントロールのコピー。
私の Pascal アプリケーション ファイルは私のサイトからダウンロードできます。ファイル名は STRBOX.PAS と MATHBOX.PAS です。
この記事で説明されている情報の更新については、このサイトを頻繁にチェックすることをお勧めします。
ここでは、読者が Delphi と Object Pascal に精通しており、インターネット、HTML、
ブラウザと World Wide Web サーバーの基本を理解している。
ISAPI
ISAPI は、インターネット情報サービスの機能を拡張できる、使いやすく強力なテクノロジです。
このテクノロジは Windows NT 4.0 に付属しており、サーバー上に WEB、FTP、および GOPHER サイトを作成できます。同時に、このテクノロジは WindowsNT3.51 Server と互換性があります [注: サーバー バージョンを指し、他のバージョンはワークステーション バージョン (トランスレーター) を指します]。
以前は、Web サーバーを拡張する最良の方法は、CGI アプリケーションを構築することでした。これらは強力なツールですが、同時に
実行形式によって制限されます [注: たとえば、PERL は解釈されて実行されます (トランスレーター)]。ブラウザからサーバーに対して CGI ベースのリクエストを行うと、CGI アプリケーションが最初にメモリに強制的に読み込まれる可能性が高く、これには多くの時間がかかります。さらに、状況によっては、CGI テクノロジを使用するのが少し難しい場合もあります。
ISAPI は、DLL を作成することによって CGI アプリケーションを置き換える方法です [注: ダイナミック リンク プログラム (トランスレーター)]。また、
ISAPI を使用してフィルターされたテキストを記述することもできますが、この記事ではこのテクノロジについては触れません。 CGI と比較すると、ISAPI は使いやすく、高速で、システム リソースを有効に活用できます。以下の点で、ISAPI DLL が CGI アプリケーションよりも優れている理由を詳しく説明します。
ISAPI DLL は HTTP サービスと同じアドレスに配置されるため、サーバーから HTTP サービスに直接アクセスできます。 CGI アプリケーションと比較すると、メモリへの読み込みが速く、サーバー上でリクエストを行う際に必要な一時停止時間が短くなります [注: リクエストを行ってからサーバー (トランスレータ) からの応答を受信するまでの時間を指します]。これは、サーバーの負荷が高い場合にはさらに重要になります。
DLL をいつロードおよびアンロードするかを制御できます。たとえば、最初のリクエストで DLL をプリロードできます。
ISAPI アプリケーション DLL が使用されていない場合はアンロードして、システム リソースを解放します。
前に述べたように、ISAPI を使用してフィルターされたテキストを記述することができます [注: 一般的には C/S 構造 (トランスレーター) 内のスクリプトを指します]。
Microsoft のドキュメントによると、ISAPI 経由でテキストをフィルタリングして次のことを行うことができます。
ユーザー認証スキーム
圧縮
暗号化
ログイン
トラフィック分析またはその他のリクエスト分析 (たとえば、「....etcpassWord」でのリクエストの検索)
この記事では、データ セットを返す DLL の作成方法、またはブラウザを実行しているユーザーと対話する方法に焦点を当てます。
簡単な連絡を取りましょう。
ISAPI の基本
HTTPEXT.PAS ファイルには、ISAPI を使用するための重要なステートメントが含まれています。この文書には、
Delphi版を配布しました。この記事の ISAPI セクションに添付されている Borland のサイトにもあります。これは NT テクノロジに基づいているため、このテクノロジを適用するには Delphi2.0 以降を使用する必要があります。 16ビットエディタでは使用できません。
HTTPEXT.PAS には、Microsoft によって作成された ISAPI テクノロジのインターフェイスが含まれています [注: Delphi インターフェイスを指します。ISAPI は C++ でコンパイルされています
執筆(翻訳者)】。 Delphi を作成する場合、ISAPI ユーザー インターフェイスは提供されていません。Microsoft の既存のテクノロジの使用方法のみを説明します。ただし、ISAPI は使い方が簡単すぎるため、ほとんどのユーザーにとって、ユーザーのバージョンの Delphi オブジェクトは必要ありません。
ISAPI DLL への入り口として使用できる関数は 3 つあり、最初の 2 つは必須で、3 つ目はオプションです。
GetExtensionVersion: 最小バージョンを確認する
HttpExtensionPRoc: これは、Delphi アプリケーションの begin...end ブロックと同様に、DLL のエントリ ポイントです。
TerminateExtension: これは、他のメモリ割り当てをクリーンアップするためのスレッドとして使用できるオプションのプログラムです。
ISAPI DLL を作成するときは、上記の 3 つの関数のうち最初の 2 つを参照する必要があります。これを実行します。
すべての ISAPI プログラミングの鍵となるのは 2 つの関数です。
3 つのステートメントにはすべて、ISAPI DLL がインターネット インフォメーション サービスを拡張するために使用される用語「ワード出力」が含まれています。
デバイス。 (Internet Information Server は Microsoft Server を指します。NT サーバーを物理 Web サーバーとして使用したい場合、これがまさに必要なツールです。ISAPI DLL は NT4.0 とともに配布され、オペレーティング システムのインストール時にインストールされます)が自動的にインストールされます。)
ISAPI は、運用サーバーが従うことができる標準を提供します。たとえば、Netscape の複雑な NSAPI インターフェイスを使用できます。
NSAPI インターフェイスを操作するために、関連する簡潔で美しい ISAPI に圧縮されています。
以下は、これら 2 つの重要な関数の宣言です。
関数 GetExtensionVersion(var Ver: THSE_VERSION_INFO): BOOL;
関数 HttpExtensionProc(var ECB: TExtensionControlBlock): DWORD;
GetExtensionVersion を DLL に貼り付けるだけで完了します。ISAPI が新しいバージョンを公開するときに、わずかな変更を加えるだけで済みます。
関数 GetExtensionVersion(var Ver: THSE_VERSION_INFO):
BOOL; 標準呼び出し;
始める
Ver.dwExtensionVersion := $00010000; // 1.0 のサポート
Ver.lpszExtensionDesc := 'Delphi 2.0 ISAPI DLL'; // 説明
結果 := True;
終わり;
この関数に渡されるパラメータは、HTTPEXT.PAS で次のように宣言されます。
関連するパラメータは、HTTPEXT.PAS で次のように宣言されます。
PHSE_VERSION_INFO = ^THSE_VERSION_INFO;
THSE_VERSION_INFO = パックされたレコード
dwExtensionVersion: DWORD;
lpszExtensionDesc: Char の array[0..HseMaxExtDLLNameLen-1];
終わり;
定数 HseMaxExtDllNameLen の宣言内の値は 256 です。レコード内の 2 つの変数は「自己宣言」されており、前者には ISAPI バージョン番号 [注: 変数 dwExtensionVersion (Translator)] が含まれており、後者は DLL を記述するために使用されるユーザー定義の文字列を表します。
GetExtensionVersion ステートメントを参照する場合は、DLL プログラムの DPR ファイル セクションに入力を追加する必要があります。
アウト部分。このステートメントを書くときは、次のことも書く必要があります。
輸出
拡張機能バージョンの取得
HttpExtensionProc;
これは、これら 2 つの重要な ISAPI DLL の関数をセットアップするときに行うことです。次の手順である HttpExtensionProc の使用はもう少し複雑なので、別のセクションとして残しておきます。
HttpExtensionProc の操作
HttpExtensionProc ステートメントは DLL のエントリ ポイントです。その関数は C 言語の main() ステートメントに似ています。
Delphi の開始...終了部分
GetExtensionVersion ステートメントを使用した簡単な例を次に示します。
関数 HttpExtensionProc(var ECB: TExtensionControlBlock):
DWORD;
変数
ResStr: 文字列;
StrLen: 整数。
始める
ECB.lpszLogData := 'Delphi DLL ログ';
ECB.dwHTTPStatusCode := 200;
ResStr := ' +
'
「ISAPIからこんにちは」
' +
';
ResStr := フォーマット(
「HTTP/1.0 200 OK」#13#10+
'コンテンツ タイプ: text/html'#13#10+
'コンテンツの長さ: %d'#13#10+
'コンテンツ:'#13#10#13#10'%s'
[長さ(ResStr)
ResStr]);
StrLen := 長さ(ResStr);
ECB.WriteClient(ECB.ConnID
ポインタ(ResStr)
ストレン
0);
結果 := HSE_STATUS_SUCCESS;
終わり;
ブラウズ中にこの DLL にリクエストを行うと、次のような応答が返されます。
テストサーバーの結果
ISAPIからこんにちは
関数本体内のほとんどのフィールドは、基本情報を提供する単純な HTML コードと密接に関連しています。以下に示すように、TExtensionControlBlock のいくつかのフィールドに入力する必要もあります。
このレコードには WriteClient という関数ポインターがあることに注意してください。この関数を参照して情報を渡すことができます。
ブラウザに送り返します。この関数を呼び出すときは、後述する TExtensionControl ブロックの ConnID フィールドを使用します。関数が呼び出されると、ConnID が自動的に設定されます。
関数のコードを見る前に、上記のすべての HttpExtensionProc 関数をデモさせてください。
ISAPI DLLの完全なプログラム
ライブラリ Isapi1;
ライブラリ Isapi1;
用途
窓
システムユーティリティ
HTTPExt;
関数 GetExtensionVersion( var Ver: THSE_VERSION_INFO ): BOOL;
始める
Ver.dwExtensionVersion := $00010000; // バージョン 1.0 のサポートを期待しています。
Ver.lpszExtensionDesc := 'Delphi 2.0 で書かれています';
結果 := True;
終わり;
function HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ): DWORD;
標準呼び出し;
変数
ResStr: 文字列;
StrLen: 整数。
始める
ECB.lpszLogData := 'Delphi DLL ログ';
ECB.dwHTTPStatusCode := 200;
ResStr := '
' +
'
テストサーバーの結果
' +
'
Isapi が DevRel に挨拶します
';
ResStr := フォーマット(
「HTTP/1.0 200 OK」#13#10+
'コンテンツ タイプ: text/html'#13#10+
'コンテンツの長さ: %d'#13#10+
'コンテンツ:'#13#10#13#10'%s'
[長さ(ResStr)
ResStr]);
StrLen := 長さ(ResStr);
ECB.WriteClient(ECB.ConnID
ポインタ(ResStr)
ストレン
0);
結果 := HSE_STATUS_SUCCESS;
終わり;
輸出
拡張機能バージョンの取得
HttpExtensionProc;
始める
終わり。
この DLL プログラムを実行するには、NT サーバーの script ディレクトリにコピーする必要があります。私のNT4.0マシンでは
それは次のようになります:
c:winntsystem32inetsrvscriptsmystuffisapi1.dll
この例では、「mystuff」という名前のディレクトリを作成しました。
私が作成したものを保存するためにのみ使用されます
ISAPI DLL。もちろん、あなたのディレクトリは、「inetsrv」ディレクトリの場所やその他の要因によって、私のマシン上のものとまったく同じではありません。
この DLL を正常に呼び出すには、次のハイパーリンクを HTML ページに追加する必要があります。
ISAPI ワン
ユーザーがこのハイパーリンクをクリックすると、ISAPI1 Dll が呼び出され、「Hello from ISAPI」という文字列が表示されます。
ユーザーのブラウザに表示されます。 ISAPI.DLL を mystuff ディレクトリに配置しない場合は、上記の HTML コードを変更して状況に合わせて調整する必要があります。ディレクトリは inetsrv ディレクトリに相対する必要があり、DLL 全体が配置されているディレクトリを含めることはできません。
呼び出しの完全な HTML スクリプトは次のとおりです。
これは私の自宅のコンピューターのホームページです。
ISAPI ワン
プログラム ISAPI1.DLL を mystuff ディレクトリに複数回コピーする場合は、
Web サーバーの World Wide Web ポートを閉じます。これは、この DLL を初めてコピーするときは制限がありませんが、それ以降はサーバーに属するためです。したがって、最初のコピーの更新バージョンをコピーするときは、World Wide Web サービスをオフにする必要があります。ネットワーク管理プログラムを使用して、World Wide Web サービスをオフにすることができます。このプログラムは Microsoft Internet Server グループの下にあり、ネットワーク インフォメーション サービスのインストール時にエクスプローラー/プログラム マネージャーの下にインストールされる必要があります。
TExtensionControlBlock で動作します
この記事のこの時点で、最初の ISAPI DLL を構築し、それを 2 台目のマシンでオンラインで実行できるようになります。
Web ブラウザがそれを呼び出します。
ISAPI の残りの部分については、この記事でさらに詳しく説明します。
HttpExtensionProc パラメータのより複雑な部分は次のとおりです。
PExtensionControlBlock = ^TExtensionControlBlock;
TExtensionControlBlock = パックされたレコード
cbSize: DWORD; // = sizeof(TExtensionControlBlock)
dwVersion: DWORD; // この仕様のバージョン情報
ConnID: HCONN; // コンテキストは変更しないでください。
dwHttpStatusCode: DWORD; HTTP ステータス コード
// この拡張 DLL に固有の null で終了するログ情報
lpszLogData: Char の配列 [0..HSE_LOG_BUFFER_LEN-1]。
lpszMethod: PChar; // REQUEST_METHOD;
lpszQueryString: // QUERY_STRING;
lpszPathInfo: PChar; // PATH_INFO;
lpszPathTranslated: PChar // PATH_TRANSLATED;
cbTotalBytes: DWORD; // クライアントからの合計バイト数
cbAvailable: DWORD; // 利用可能なバイト数
lpbData: ポインタ; // cbAvailable バイトへのポインタ
lpszContentType: PChar; // クライアント データのコンテンツ タイプ
GetServerVariable: TGetServerVariableProc;
WriteClient: TWriteClientProc;
ReadClient: TReadClientProc;
ServerSupportFunction: TServerSupportFunctionProc;
終わり;
このレコードには前述の ConnID フィールドが含まれており、最初のパラメータが WriteClient に渡されていることに注意してください。
このレコードの最初のパラメータはバージョン管理用です。これは、指定された TExtensionControlBlock のサイズである必要があります。 Microsoft がその構造を変更した場合、レコード サイズをチェックすることで、どのバージョンの構造を扱っているかを判断できます。 このレコードの最初の 3 つのフィールドは必要ありません。これらのフィールドはすでに ISAPI によって設定されており、プログラム内でのみアクセスでき、変更できません。
おそらくこのレコードで最も重要なフィールドは、サーバーからのリクエストを含む lpszQueryString です。
情報。たとえば、ISAPI1.Dll というファイルを作成したとします。この DLL を呼び出すには、ブラウザのページに次のような HREF を作成します [注: HTML 言語の形式 (トランスレータ)]。
テスト 1
この DLL に応答したい場合は、上記の行を次のように変更する必要があります。
テスト 1
HTML コード スニペットに上記の 2 行のうち 2 行目のようなものが含まれている場合、DLL には lpszQueryString パラメータが含まれます。
「MyQuery」の文字列を取得します。リクエスト文字列に続くリクエスト フラグの使用に特に注意してください。
もちろん、リクエスト文字列は自由に変更できます。たとえば、次のように書くことができます。
テスト 1
この要求では、この DLL はサーバーの名前を返します。このパラメータを渡すときは、いかなる制限も受けません。あなた
必要なものを何でも渡すことができ、DLL 内の情報をどのように分析するかはあなた次第です。
サーバーからブラウザに情報を返すときは、このレコードの「WriteClient」関数ポインタを使用します。
。このポインタを初期化するときに何もする必要はありません。このポインタはネットワーク情報サーバーによって自動的に渡されます。
CGI アプリケーションの作成者は、リクエスト文字列を渡すための構文が非常によく知られていることに気づくでしょう。実際、ISAPI は CGI の後に続きました。
ほとんどの規約と同様、TExtensionControlBlock のほとんどのフィールドは CGI テクノロジによって単純に借用できます。
TExtensionControlBlock のもう 1 つのキー フィールドは lpbData です。これには、閲覧によってアップロードされた追加情報が含まれています。
たとえば、複数のフィールドを持つ HTML フォームがある場合、これらのフィールドに含まれる情報は「」と呼ばれます。
この記事の次のトピック「[OK] ボタンからの情報の取得」では、この状況に対処する方法に焦点を当てます。
これまで、TExtensionControlBlock の 4 つのキー フィールドを紹介しました。
WriteClient: フォーマットされた HTML データをブラウザーに渡すことを可能にするポインター。この機能が使われているのは
TExtensionControlBlock の ConnID フィールド。
lpszQueryString: ブラウザからのリクエスト。
lpbData: ブラウザからアップロードされた追加データ。通常、HTML フォーム内のフィールドの内容
。これについては「確認ボタン」セクションで詳しく説明します。
TExtensionControlBlock の他のフィールドがどのように機能するかを理解するには、次の方法が最適です。
参照して比較してください。言い換えれば、ユーザーがクライアントの ISAPI DLL を呼び出せるようにする HTML ページを作成する必要があります。この ISAPI DLL の目的は、TExtensionControlBlock の各フィールドを HTML でフォーマットし、ブラウザに戻すことだけです。これにより、ブラウザが、TExtensionControlBlock 内のすべてのフィールドを表示する少し恐ろしいデバッガに変わります。
以下は、Borland の Danny Thorpe によって作成された、このタスクを実行するプログラムです。
ライブラリtest1;
用途
窓
システムユーティリティ
HTTPExt;
関数 GetExtensionVersion( var Ver: THSE_VERSION_INFO ): BOOL;
始める
Ver.dwExtensionVersion := $00010000; // 1.0 のサポート
Ver.lpszExtensionDesc := 'Delphi 2.0 で書かれたテスト DLL';
結果 := True;
終わり;
関数 HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
変数
ResStr: 文字列;
StrLen: 整数。
Buf: Char の配列 [0..1024]。
始める
ECB.lpszLogData := 'Delphi DLL ログ';
ECB.dwHTTPStatusCode := 200;
ResStr := フォーマット(
' +
'
'サイズ = %d
'+
'バージョン = %.8x
'+
'ConnID = %.8x
'+
'メソッド = %s
' +
'クエリ = %s
' +
'パス情報 = %s
'+
'パス翻訳 = %s
'+
'TotalBytes = %d
'+
'利用可能なバイト数 = %d
'+
'コンテンツタイプ = %s
'+
'
[ECB.cbサイズ]
ECB.dwバージョン
ECB.ConnID
ECB.lpszメソッド
ECB.lpszQueryString
ECB.lpszPathInfo
ECB.lpszPathTranslated
ECB.cbTotalBytes
ECB.cb利用可能
ECB.lpszContentType]);
ECBと協力して
始める
StrLen := Sizeof(Buf);
GetServerVariable(ConnID
'REMOTE_ADDR'
@ブフ
StrLen);
ResStr := ResStr + 'REMOTE_ADDR = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
「リモートホスト」
@ブフ
StrLen);
ResStr := ResStr + 'Remote_Host = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
「REMOTE_USER」
@ブフ
StrLen);
ResStr := ResStr + 'Remote_User = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
「SERVER_NAME」
@ブフ
StrLen);
ResStr := ResStr + 'SERVER_NAME = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
「サーバーポート」
@ブフ
StrLen);
ResStr := ResStr + 'SERVER_PORT = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
'サーバー_プロトコル'
@ブフ
StrLen);
ResStr := ResStr + 'SERVER_PROTOCOL = '+Buf+'
';
StrLen := SizeOf(Buf);
GetServerVariable(ConnID
「サーバー_ソフトウェア」
@ブフ
StrLen);
ResStr := Format('%sSERVER_SOFTWARE = %s
'+
'スレッドID = %.8x
'
[抵抗力
バフ
GetCurrentThreadID]);
終わり;
ResStr := ResStr + ';
ResStr := フォーマット(
「HTTP/1.0 200 OK」#13#10+
'コンテンツ タイプ: text/html'#13#10+
'コンテンツの長さ: %d'#13#10+
'コンテンツ:'#13#10#13#10'%s'
[長さ(ResStr)
ResStr]);
StrLen := 長さ(ResStr);
ECB.WriteClient(ECB.ConnID
ポインタ(ResStr)
ストレン
0);
結果 := HSE_STATUS_SUCCESS;
終わり;
輸出
拡張機能バージョンの取得
HttpExtensionProc;
えぎん
終わり。
この DLL を呼び出すには、次の行を含む HRML スクリプトを作成する必要があります。
テスト 1
「確認」ボタンから情報を取得
通常、情報を送信する HTML フォームには確認ボタンがあります。情報量が 49KB 未満であれば、
TExetensionControlBlock の lpbData フィールドが使用可能であることを考慮してください。その方法は次のとおりです
ほとんどの場合、このフィールドへのポインターによって送信された情報が取得されます。
変数
S: 文字列。
始める
…
S := PChar(ECB.lpbData);
…
終わり;
このフィールドから取得される情報が 48KB より大きい場合は、ReadClient を呼び出して残りの情報を取得する必要があります。
lpbData フィールドで利用可能な情報を正確に知りたい場合は、次の 2 つの関数を使用してデータを Web ブラウザに戻すことができます。
関数 SetUpResString: 文字列;
始める
結果 := ' +
' +
'
'lpbData = %s ' +
';
終わり;
関数 HttpExtensionProc(var ECB: TExtensionControlBlock):
DWORD;
変数
ResStr: 文字列;
StrLen: 整数。
S
S1: 文字列;
始める
ECB.lpszLogData := 'Delphi DLL ログ';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := Format(ResStr
[S]);
StrLen := 長さ(ResStr);
ECB.WriteClient(ECB.ConnID
ポインタ(ResStr)
ストレン
0);
結果 := HSE_STATUS_SUCCESS;
終わり;
次のコードが添付された HTML フォームがすでにあると仮定します。
このコードは、数値を入力するためのテキスト領域と「GetSquare」という「送信」ボタンを備えたフォームを生成します。このフォームがある場合、ユーザーがフォームのテキスト領域に数字 23 を入力したと仮定すると、上記の 2 つのプログラムは次の文字列を返すことが期待できます。
lpbData = GetSquare=23&GetSquare=送信
この時点で何が起こっているかを理解するには、上記の関数から抜粋された HTML ステートメントの主要部分に注目してください。ステートメントのこの部分はサーバー上に存在し、次のように反映されます。
'lpbData = %s ' +
上記の HttpExtensionProc 関数のコードを調べると、この文の直前で ECB.lpbData の値の代わりに Format ステートメントの %s パラメータが使用されていることがわかります。 (ステートメント Format がどのように機能するかわからない場合は、関連する Delphi ドキュメントを参照してください) [注: 著者の Delphi2 Programming Encyclopedia (Delphi2)
詳細な手順は、Unleashed (Translator) の第 3 章「文字列とテキスト ファイル」に記載されています。
上に示したフォームで、ユーザーが「確認」ボタンを押すと、lpbData によって ISAPI DLL に渡される値が次のようになったとします。
GetSquare=23&GetSquare=送信
明確なアイデアを提供するために、上記の 2 つのステートメントによってブラウザに返される情報は、すでに見た次の文字列であることを繰り返しておきます。
lpbData = GetSquare=23&GetSquare=送信
このプロセスを確認する最良の方法は、以下にリストされている ISAPI2 プログラムをテスト実行することです。 ISAPI2 は ISAPI1 に似ていますが、上に示した新しい HttpExtensionProc 関数が含まれており、SetUpResString ユーティリティ関数も含まれています。
ライブラリ Isapi2;
用途
窓
システムユーティリティ
HTTPExt;
関数 GetExtensionVersion(var Ver: THSE_VERSION_INFO):
BOOL; 標準呼び出し;
始める
Ver.dwExtensionVersion := $00010000; // 1.0 のサポート
Ver.lpszExtensionDesc := 'Delphi 2.0 で書かれた DLL';
結果 := True;
終わり;
関数 SetUpResString: 文字列;
始める
結果 := ' +
' +
'
'lpbData = %s ' +
';
終わり;
関数 HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
変数
ResStr: 文字列;
StrLen: 整数。
S
S1: 文字列;
レン: 整数。
始める
ECB.lpszLogData := 'Delphi DLL ログ';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
ResStr := Format(ResStr
[S]);
StrLen := 長さ(ResStr);
ECB.WriteClient(ECB.ConnID
ポインタ(ResStr)
ストレン
0);
結果 := HSE_STATUS_SUCCESS;
終わり;
輸出
拡張機能バージョンの取得
HttpExtensionProc;
始める
終わり。
lpbData 変数によって渡された情報をフォームから取得したら、その情報を解析したり、ユーザーに返すことができます。たとえば、上の例から数値 23 を抽出し、それを 2 乗してユーザーに返すことができます。これにより、ユーザーから情報 (この場合は数値) を取得し、その数値に対して数学的演算を実行し、最終的に結果をユーザーに返すことができます。これは、現在インターネット プログラミングで最も人気のある、インタラクティブな Web ページを放送上で作成できることを意味します。
以下は、数値の 2 乗をネットワーク経由でブラウザに送信する完全なプログラム コードです。
ライブラリ Isapi3;
{ このコードは、ブラウザ経由でユーザーから入力を取得する方法を示しています
その情報を解析する
そして特にユーザーに答えを返します。
ユーザーが番号を送信する
このコードはそれを二乗します
次に、解析のために情報を送信するブラウザからのフォームを次に示します。
}
用途
窓
システムユーティリティ
HTTPExt
StrBox;
関数 GetExtensionVersion(var Ver: THSE_VERSION_INFO):
BOOL; 標準呼び出し;
始める
Ver.dwExtensionVersion := $00010000 // バージョン 1.0 のサポート
Ver.lpszExtensionDesc := 'ISAPI3.DLL';
結果 := True;
終わり;
// lpbData を解析し、ユーザーから渡された番号を取得します。
関数 ParseData(S: 文字列): 整数;
始める
S := ストリップラストトークン(S
'&');
S := StripFirstToken(S
'=');
結果 := StrToInt(S);
終わり;
関数 SetUpResString: 文字列;
始める
結果 := ' +
' +
'
'答え = %d ' +
';
終わり;
関数 HttpExtensionProc( var ECB: TEXTENSION_CONTROL_BLOCK ):
DWORD;
変数
ResStr: 文字列;
StrLen: 整数。
S
S1: 文字列;
数値: 整数。
始める
ECB.lpszLogData := 'Delphi DLL ログ';
ECB.dwHTTPStatusCode := 200;
ResStr := SetUpResString;
S := PChar(ECB.lpbData);
数値 := ParseData(S);
数値 := Sqr(数値);
ResStr := Format(ResStr
[番号]);
StrLen := 長さ(ResStr);
ECB.WriteClient(ECB.ConnID
ポインタ(ResStr)
ストレン
0);
結果 := HSE_STATUS_SUCCESS;
終わり;
輸出
拡張機能バージョンの取得
HttpExtensionProc;
始める
終わり。
このコードは、確認ボタンを押して平方数を要求したユーザーからの次の文字列を受け入れます。
GetSquare=5&GetSquare=送信
このような入力を想定すると、このコードはインターネット経由でユーザーに次の文字列を返します。
答え = 25
一文で、ユーザーが数字 5 を入力すると、あなたはユーザーに数字 25 を返します。ユーザーが数値 10 を送信した場合、数値 100 を返します。これは些細なことのように思えるかもしれませんが、ここで重要なのはインターネット上で何が起こっているかということです [注: インタラクティブな Web ページを指します (翻訳済み)。
誰が)]
ユーザーから渡された関数を次のように分析します。
// lpbData を解析し、ユーザーから渡された番号を取得します。
関数 ParseData(S: 文字列): 整数;
始める
S := ストリップラストトークン(S
'&');
S := StripFirstToken(S
'=');
結果 := StrToInt(S);
終わり;
これら 2 つのステートメントは、この記事の冒頭で説明した単元に含まれており、私のサイトにも含まれています。 [注: この文書はインターネット上のほぼどこでも見つけることができます。
翻訳者(Translator)にリクエストすることもできます][この記事では
ISAPI について話したいだけです。これだけでも、この素晴らしいテクノロジーを活用して楽しみたいと思うには十分なはずです。次に、GetServerVariable と ReadClient の 2 つのステートメントについて説明します。これに関しては、非常に限られた実験しか行っていません。この記事では、HTTPEXT.PAS ファイルを添付しました。このファイルは、この重要なドキュメント以外には見つからないからです。
GetServerVariable および ReadClient ステートメント
CGI アプリケーションで情報をリクエストするのと同じように、ステートメントを使用してサーバーから情報を取得できます。 このステートメントを呼び出す例を次に示します。
Len := HseMaxExtDllNameLen;
SetLength(S1
レン);
12 月 (レン);
ECB.GetServerVariable(ECB.ConnID
'CONTENT_LENGTH'
PChar(S1)
レン);
まず、このコードはサーバーから取得した情報を保持するバッファーの長さを設定します。次に、サーバーを呼び出してリクエストを作成します。この場合、サーバーからのメッセージの「CONTENT_LENGTH」を要求します。
Microsoft のドキュメントには、GetServerVariable の 2 番目のパラメーターとして次の文字列を渡すことができると記載されています。
AUTH_TYPE 使用される認証のタイプが含まれます。たとえば、Basic 認証を使用している場合は、
文字列は「basic」です。NT チャレンジ応答の場合、文字列は「NTLM」です。他の承認には、対応する特定の文字列があります。新しい認証タイプがサーバーに常に追加されるため、考えられるすべての文字列をリストすることは現実的ではありません。文字列が空の場合、認証は使用されません。
CONTENT_LENGTH スクリプトがクライアントから再利用することを期待するバイト数。
CONTENT_TYPE リクエスト アドバタイズメントの本文によって提供される情報のコンテンツ タイプ。 [注: 弟は才能も知識も劣っています。
POSTリクエストは一時的に「リクエスト通知」と翻訳されています。修正してください(翻訳者)]
PATH_INFO クライアントによって提供される追加のルーティング情報。スクリプト名の後に URL へのパスが含まれます。
による。存在する場合は、リクエスト文字列の前に置かれます。
PATH_TRANSLEATこれはPATH_INFOの値ですが、パスフラグに拡張されたすべての仮想ルートの名前が含まれています。
Query_Stringこのスクリプトを指す「?」に続く情報。
remote_addr要求クライアントまたはそのエージェントのIPアドレス(たとえば、ゲートウェイやファイアウォール)。
remote_host要求クライアントまたはそのエージェントのホスト名(たとえば、ゲートウェイやファイアウォール)。
remote_userこれには、クライアントが提供し、サーバーによって承認されたユーザー名が含まれています。空の文字列が返された場合、ユーザー
あなたの名前で(ただし、許可が付いています)。
UNMAPPED_REMOTE_USERこれは、次の特性を持つユーザーの名前です。このユーザーは、NTユーザーアカウント(これが彼のID)にリクエストを行い、その後ISAPIアプリケーションフィルターがユーザーをマッピングしました。
request_methodはHTTPリクエストメソッドです。
script_name実行されたスクリプトの名前。
server_name自己参照URLに表示されるときのホスト名またはIPアドレス。
server_portリクエストを受け入れるTCP/IPポート。
server_port_secure 0または1のいずれかの文字列。それ以外の場合は、リクエストが0 0で処理される場合です。
server_protocolは、このリクエストに関連付けられたプロトコル情報の名前とバージョンを受け入れます。通常、HTTP/1.0です。
Server_Softwareは、ISAPIアプリケーションDLLプログラムが実行されるWebサーバーの名前とバージョンです。 ALL_HTTP前の変数はすべてのHTTPヘッダーを解析しませんでした。これらの変数は、http_ <フィールドヘッダー名>から派生しています。フィールドヘッダー(ラインマーカーで分離)には、終了しない個々の文字列が含まれています。
HTTPフィールドヘッダーのHTTP_ACCEPTスペシャルケース。受け入れられた値は次のとおりです。フィールドはコンマ(、)で区切られています。例:if
次の行は、HTTPヘッダーの一部です。
受け入れる: */ *、q = 0.1
次に、URL(バージョン2.0の新機能)が基本的な部分を示します。
上記の情報は、TextensionControlblockレコードによって自動的に渡されることに注意してください。なぜなら
これのためにgetServervariableに電話する必要はありません。ただし、特にreadClientから情報を取得したい場合、読み取る情報の量を知る必要がある場合は、実際に必要な場合は呼び出すことができます。
多くの場合、readclientを呼び出す必要はありません。ただし、ブラウザから送信されたメッセージのサイズは48kbを超えています
時間、残りの情報を取得するには、readclientを呼び出す必要があります。