|
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」
[Q]
Delphi 1.0J でのParamStr(i)全体の長さ制限はどうなっていますか?
かなり短いようですね。
[A]
Delphi 2.0J に関しては前にアップしています。当然、1.0J(Windows3.1)
も気になるところでしたが、Windows3.1 では、特殊なランチャーでないと、
ファイルマネージャからファイルをドラッグ&ドロップというのができない
ため、あまり注意を払われなかった面があります。しかし、実際試してみる
と、かなり悲惨な状況になっていることがわかりました。
これを知ると、Windows95での、
「指定されたテ゛ィハ゛イス、ハ゜ス、またはファイルへのアクセスは拒否されました。」
というエラーが、実は救世主だったってことがわかります。1.0J(Windows
3.1)で、ファイルドロップを受け付けるランチャー、つまり、ドロップフ
ァイルをコマンドラインで受け入れて起動するものを使ってやって見ると、
2.0J では、
ParamStr(0)+ParamStr(1)+...+ParamStr(n)
が制限されていましたが、1.0J では、
ParamStr(1)+...+ParamStr(n) ...{*}
が、126文字に制限されていることがわかりました。いずれもParamStr(i)間
に1バイトあるとします。グローバル変数 CmdLine も、{*}が、ParamStr(i)
間に半角空白1つを含んで設定されます。
問題は、この制限が、起動時にチェックされず、126文字より長い引数を渡
したとき、CmdLineにはノーチェックで書き込まれ、運が悪いときには一般保
護違反などが起きることです。
さて、特殊なランチャー以外で、このことを確かめるには、Delphi 1.0J
の IDE の、実行(J)の、引数(P)のエディットボックスを使う方法があります。
これは、引数を入れてみると255文字入ります。それでこの制限近くに設定し
て実行させ、ParamCount や ParamStr(i) を表示させると、むちゃくちゃに
表示されます。最もその前に、通常は一般保護違反なんかが起きますが。
これ以外に確かめる方法として、ファイルマネージャやプログラムマネー
ジャの「名前を指定して実行」というのを使ってやろうとしましたが、プロ
グラムマネージャの方は「名前を指定して実行」の入力ボックスが、
ParamStr(0)込みで128文字であること、ファイルマネージャの方は、入力ボ
ックス自体は259文字まで入れられるものの、ParamStr(1)以降129文字程度で
実行しても、Delphiプログラムでこれを処理する前に、ファイルマネージャ
に捕まり、そこから致命的なシステムエラーが出て、ファイルマネージャを
二度と起動できなくなりました。
あっと、ファイルマネージャの実行ファイルに、複数のファイルをドラッ
グ&ドロップしても、「マウス操作の確認:...ファイルを、....EXE
ファイルから開きます。よろしいですか?」というような、Windows95に染ま
った操作からは思いも寄らないような確認メッセージが現れます。試しに
「OK」してみると、複数ファイルをドロップしても1つしか受け付けられませ
ん。
それから、プログラムマネージャの方は、実行ファイルアイコンへのファ
イルのドラッグ&ドロップができません。
従って、Windows95と違い、Win3.1では標準機能でこれができないため、通
常はあまり注意を払う必要のない事項かも知れませんが、2.0J との対比で、
あえて挙げておきます。
何度か触れたランチャーですが、
TOOLBAR.EXE
Copyright (C) Juan M. Aguirregabiria 1993-1994、wtpagagj@lg.ehu.es
Windows3.1版。Freeware。TLBAR230.ZIP。実行ファイルのアイコンを登録
して、並べておけるランチャーです。ファイルマネージャからファイルをド
ロップできます。
「Windows Online Software オンラインソフトウエア厳選ライブラリ
Vol.4」(ログ・インターナショナル著、Windows Magazine編集部編、アス
キー)1995 収蔵。
を挙げておきます。
最後に、ドロップファイルをコマンドラインで受け入れて起動するランチ
ャーを使って、運良く一般保護違反にならずに起動できた場合に、受け入れ
たファイルを正常に処理できるルーチンを、下に例示しておきます。
●Delphi1.0J-Windows95の場合。
Win3.1でコンパイルしたものをWin95で実行、あるいはDelphi1.0J-Win95
でコンパイルしてWin95で実行、いずれの場合も、間の1バイト込みで{*}が
126文字を越えると、エラーメッセージ、
「(実行ファイル名でタイトル表示)
(実行ファイル名)
システムに装着してあるデバイスは動作していません。」
が出て、Win3.1の場合のような不具合が回避されるようになっていることに
気づきました。従って、[例]のルーチンは不要です。
[例]
{=========================================================}
{Win3.1で、ファイルをドロップして、運良く起動し、これらの
ファイルを正常に処理したい場合、修正されたParamCountを取得}
function NewParamCount: integer;
var
vParamCount,
fTotLen,vTotLen,
i,iInt
: integer;
Mes,
stParam: string;
begin
vParamCount:=0;
vTotLen:=0;
i:=0;
repeat
inc(i);
stParam:=ParamStr(i);
if i>=2 then iInt:=1
else iInt:=0;
fTotLen:=vTotLen;
inc(vTotLen,iInt+Length(stParam));
vParamCount:=i;
if vTotLen>CMD_LENGTH then begin {CMD_LENGTH=126}
vParamCount:=i-1;
vTotLen:=fTotLen;
break;
end;
until (i=ParamCount);
if vParamCount<ParamCount then begin
Mes:=
'引数文字数合計が126を超えました。'#13+
'一般保護例外やシステムエラーが出なかったの'#13+
'は幸いでした。次回は引数を減らして下さい。'#13+
'今回は、引数 '+IntToStr(vParamCount)+' 個のみ使います。';
MessageDlg(Mes,mtWarning,[mbOK],0);
end;
Result:=vParamCount;
end; {NewParamCount}
使い方:
{適当に宣言}
var
nParamCount
: integer;
procedure TForm1.FormCreate(Sender: TObject);
begin
if ParamCount=0 then exit;
nParamCount:=NewParamCount;
for i:=1 to nParamCount do begin
{ParamStr(i)は利用できる}
{..以下略..}
end;
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。
Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会
|