./index.html ../index.html

CGI Note

…Win32なCGIなんて動かさせてくれるところないだろーが…というツッコミを自分でもしたくなるのですが、CyberXに迷惑かけたのでノウハウ蓄積の意味でhtmlにしておきます。遊びとしては面白いのでやってみよー。

テスト用サーバー

先生!設定が奥にあり過ぎてメンドイです
ノートン先生を使っている場合は、ファイアウォールルールの奥底を弄って、TCP接続インバウンド80番を許可しておく。 *1

それでサーバー立てる気も無く単なる実験用にapacheとかインストールしてみたりして。

アパッチの雄叫びウララア

apacheは大掛かり過ぎると思うならAN HTTPDでも。こっちのほうが簡単でいいです。

☆師匠はこれでサーバサイドJavaScript掲示板を作られた

コンソールアプリ

うわ、手抜きだ…。

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

begin
  WriteLn('content-type: text/html');
  WriteLn;
  WriteLn('<HTML>');
  WriteLn('<HEAD>');
  WriteLn('<TITLE> CLOCK </TITLE>');
  WriteLn('</HEAD>');
  WriteLn('<BODY>');
  WriteLn('<H2>');
  WriteLn(FormatDateTime('yy-mm-dd hh:MM:ss', Now));
  WriteLn('</H2>');
  WriteLn('</BODY>');
  WriteLn('</HTML>');
end.

コンパイルしたものをcgi-binにコピーします。

ブラウザはLunascape/blue eyes

こんなものでも動いたら感動しません?ねえ、しません?

dll

DelphiのPro版以上ならウィザードからapache用dll型CGIが作成可能です。
やりかたは、僕が説明するよりマニュアル読んだ方が確実でしょ。(手抜き)

作ったdllの拡張子をsoに変えて、httpd.confの一番下にこんな風に書き足せば動くみたいです。

LoadModule exec modules/xxxtest.so
<location /xxxtest>
  SetHandler xxxtest-handler 
</location>

この場合、http://localhost/xxxtest ってことですね。

IntraWeb

CGIがRADで作れてしまうIntraWeb

そこでは、JavaScriptとスタイルシートを駆使した、正直、思いっきり不自然なUIが繰り広げられます。WindowsのメニューモドキとかOutlookバーモドキとか、DateTimePickerモドキには恐れ入りました。

Enterprise版ではこれをそのまま運用できるらしい

単体でサーバーexeにもできます。

dllにした時は、上と同じやり方でapacheに読ませる方向で。バグがあると、apacheが中途半端に落ちるので、タスクマネージャで完全に殺すまで次を起動してはいけません。

Delphi7に添付されたバージョン(5.0)は、CGIとしての使用に問題があります。Delphi7のユーザーであればIntraWeb5.1に無償アップグレードできますので申し込みましょう。

さて、Dr.Bob Examinesにて、DelphiのPro版以上の機能であるWebBrokerを併用して、IntraWebをCGIとして使える単なるコンソールアプリケーションにしてしまうチュートリアルがあります。これでしたらAN HTTPDからでも使えてしまうんです。

WebBrokerとして新規作成。CGI実行形式を選びます。

日ごろ滅多に使わないアイテムですのでドキドキ

「クロスプラットフォーム」のチェックで何が変わるのかは不明

自動生成されるWebモジュールにIWPageProducerとIWModuleControllerを配置。

pdfとかはEnterprise版の機能であるWebSnapベースで説明されてます

それから、Webモジュールをダブルクリックして、アクションをひとつ作ってDefault=True, Producer=IWPageProducer1としておきます。

新規作成のIntraWebのページから、Page Formをひとつ作ります。

このダイアログはIntraWeb5.0には無いです

IWPageProducer1.OnGetFormで、フォームとアクションとの結びつけを行います。

procedure TWebModule1.IWPageProducer1GetForm(ASender: TIWPageProducer;
  AWebApplication: TIWApplication; var VForm: TIWPageForm);
begin
  VForm := TIWForm2.Create(AWebApplication)
end;

これで準備OK。

後はフォームを作るのみ。

とある情報ではこれだけで癒されるらしい…私は認めませんが

procedure TIWForm2.IWButton1Click(Sender: TObject);
begin
  if IWEdit1.Text = '' then
    IWLabel2.Caption := 'なにかおしえてくださいよ'
  else
    IWLabel2.Caption := 'あなたは' + IWEdit1.Text + 'なのね'
end;

コンソール.exe型のCGIですので、当然リクエスト毎に終了するわけです。従ってグローバル変数で情報を覚えておけない事は心の片隅で覚えておくべきです。…ってそんな必要も無い例ですが。

GreenBrowserでもblue eyes

何が素敵って、ASP.NETがVS.NETやIISぐるみでようやく実現したものを、Delphiに元からあったGUIビルダの使いまわしでもって、単独の実行ファイルに収めてしまうところが素敵。


*1 穴を開けっ放しにしておくと、ランダムにIPを指名して接続してくる謎なものがやってくるので、相手コンピュータをlocalhost以外は禁止にしといたほうがいいです。