« 2009年11月 | トップページ | 2010年1月 »

2009/12/19

LazarusでCGI

 

 LazarusでCGIを作成しようと思い、まずはHelloWorldを作成してみました。
 以下のコードを書いて、デバッガでテストをした後、Apache2の動いているサーバーへコピーし、ブラウザからアクセスすると、もちろんちゃんと表示されました。

program cgi1;

{$mode objfpc}{$H+}

uses
  Classes, sysutils;

begin
  try
    writeln('Content-Type: text/plain');
    writeln('');
    writeln('HelloWorld');
    flush(StdOut);
    Exit;
  except
    on E: Exception do
    begin
      writeln(e.Message);
    end;
  end;
end.

 いちいちサーバーにコピーするのが面倒になり、開発マシンにAnHttpdを入れてCGIを実行したところ、「ハンドルされていないWin32の例外が発生しました。」となってAnHttpdのプロセスが異常終了してしまいました。
 プログラムが悪いのか、環境が悪いのかわからず試行錯誤を繰り返し、約半日が過ぎ去ったとき、ふと、ファイル名を変えてみると、なんと動きました。

cgi.exe -> OK
cgi1.exe -> NG
cgi01.exe -> OK
cgi10.exe -> OK
cgi2.exe -> NG

test.exe -> NG
test1.exe -> OK
test01.exe -> OK
test10.exe -> OK
test2.exe -> OK

testcgi.exe -> OK
testcgi01.exe -> OK
tstcgi01.exe -> NG

 他にもいろいろファイル名を変えて試しましたが、規則性はよくわかりません。Delphiでも試そうかと思いましたが、疲れたのでこの辺でやめておます。(ちなみに、AnHttpdに同梱されていたtest.batも同様に異常終了するので...)

| | コメント (0) | トラックバック (0)

2009/12/06

PowerPDFとByteType

 

Lazarus-ccrからPowerPDFコンポーネントをチェックアウトし、Lazarusにインストールしてみたのですが、日本語が全く表示されませんでした。
 なんとなく、UTF8化されていないんだろうなあと思いつつ、デバッガでソースを追ってみました。
 すると、sysutilsユニット(sysstrh.inc)で定義されているByteType関数の戻り値が、mbSingleByteしか返さないことに気がつきました。
 まずは、UTF8に対応したByteType関数を作成する必要がありそうです。

| | コメント (0) | トラックバック (0)

2009/12/01

Lazarus メモリーリーク検出方法

 Delphiでメモリーを検出するには、FastMMやReportMemoryLeaksOnShutdownというものが使えますが、Lazarusではheaptrcユニットを使用するようです。

 わたしが試したところでは、使用方法は2通りあり、1つ目はDelphiでFastMMを使用するときと同様、プロジェクトファイル(.lpr)のuses節の最初にheaptrcを追加する方法です。

 もうひとつは、コンパイラオプションで-ghを指定する方法です。これはプロジェクトメニューからコンパイラオプション→リンクと開き、Heaptrcユニットを使用(-gh)にチェックを付けることと同じです。

Heaptrc2

 わざとリークさせてみたところ、アプリケーション終了時に、以下のダイアログが表示されました。表示されている line33 of Unit1.pas を調べてみると、 SL := TStringList.Create; としている箇所でした。

Heaptrc

 ただ、リークがない場合でもダイアログが表示されるので、リリース時にはheaptrcを外すよう、気を付けておく必要がありそうです。

| | コメント (0) | トラックバック (0)

« 2009年11月 | トップページ | 2010年1月 »