|
15番会議室「FAQ編纂委員会」に寄せられた「よくある質問の答え」
[Q]
ショートカットにファイルなどをドラッグ&ドロップすると、ファイル名が
ParamStr(i) に渡されて起動しますが、大量にドロップすると、
「指定されたテ゛ィハ゛イス、ハ゜ス、またはファイルへのアクセスは拒否されました。」
というようなエラーメッセージが出て、起動しません。ParamStr(i)全体の長
さなどに制限があるのですか?
[A]
ずばり、516 文字です。これは、
ParamTotalLength:=0;
for i:=0 to ParamCount do begin
if i>0 then inc(ParamTotalLength);
inc(ParamTotalLength,Length(ParamStr(i)));
end;
で、計算した、ParamTotalLength=516 ということです。ParamTotalLengthを
別の言葉で言うと、自分自身のフルパス名の長さに、引数として渡された、
各ファイル名のフルパス名の長さ、プラス、各引数間の区切り記号1バイト
の合計、です。これを1バイトでも越えると、上のようなエラーで起動でき
ません。
長さ制限とは直接関係ありませんが、いくつか注意点を書きます。
●(1) ParamStr(0)、つまり、自分自身のフルパス名は、ロングディレクトリ
ー名およびロングファイル名が使われますが、ドロップして渡される、
ParamStr(i) (i>0) には、省略形の、ディレクトリー名、ファイル名が使わ
れます。従って、ParamStr(i) (i>0) をロング名に戻してから使う必要があ
ります。
ファイル名の場合、
瑠瓏 さんの、
>00027 KHB05271 瑠瓏 [FAQ] LongFileName を求める
ディレクトリー名もファイル名も必要な場合、
SBORLAND 旧MES 16 #226 の、TJIN さんの、
>function GetLongFileName(PathName: String; Attr: integer): String;
>{本関数は、GetLongPathNameの専用関数として使用する}
>function GetLongPathName(PathName:String): String;
あるいはここの、
>[FAQ]フルパスの長い名前を求める
が、便利です。なお、ParamStr(i) (i>0) で省略形が使われるのは、より多
くの引数を確保するためと思われます。
●(2) 516 文字の理由は、フルパスファイル名として許容できる、258 文字
(ルートのファイル名 255 文字+ルートパス名長さ 3)の 2 倍、つまり、
最低 1つの引数を確保した長さと思われます。そうであるならば、
(自分自身のフルパス名 258 文字) +
(区切り 1 バイト)+ (ParamStr(1)=258)
で、517 文字を上限とすべきでしょうが、そう単純ではありません。
エクスプローラで実験してみると、0 バイトのファイルで、フルパス 254
文字位が限度ですし、実行ファイルのフルパスも、あるフロッピーで試した
場合には、78 文字あたりが限度でした。ただし、フロッピーをフォーマット
し直して試すと、フルパス258文字(ディレクトリー27段!)で実行できまし
たが、その途中のディレクトリーでは、コピーして置くことができた後、実
行エラーや、そこから移動、削除ができない箇所が所々にありました(この
あたりは、マシン環境-ディスクがMSDOS 互換とか、32ビットプロテクトモー
ドのデバイスドライバを使わないとか、が絡んでるのかも知れません)。
●ParamStr(i) (i>0)が1つ、つまり、ParamStr(1)だけのとき、この長さは
256 文字に制限されます。このことに関しては、FDelphi MES 8 #1106 瑠瓏
さんより、ソースコードで、GetParamStr関数のバッファが256バイトしか取
っていない、と指摘をいただきました。
●(3) 引数の間の区切り記号 1 バイト、というのは、グローバル変数、
CmdLine では、半角スペース 1 つ、となって、
"ParamStr(0)" ParamStr(1) ParamStr(2) ...
と納められますので、上記の制限は、CmdLine の長さが、ParamStr(0) の二
重引用符分と最後のヌルを入れて、519 文字に制限されている、と言い変え
ることもできると思います。
●(4) ショートカットファイルはパス名が、
D:\WIN95\テ゛スクトッフ゜
というようなディレクトリーに来ますが、デスクトップに、実行ファイルを
直接置くこともできますので(マウスドロップ時に Ctrl あるいは Shift 押
下)、その場合は、パス名は、実際のフルパス名になります(サイズはもち
ろん、ショートカット(ファイル)の方が小さいわけですが)。いずれにド
ロップしても、同じように、ファイル名が ParamStr(i) (i>0) に渡されて起
動します。
●以上、確認環境:98シリーズ、Windows95、コントロールパネルのシステム
−パフォーマンスで、MSDOS 互換モードのファイルシステム、さらに、その
フォームで選べる、ファイルシステムのプロパティー−トラブルシューティ
ングで、32ビットプロテクトモードのディスクドライバを使わないにチェッ
ク。
ここにあるドキュメントは NIFTY SERVEの Delphi Users' Forum FDELPHIに寄せられる質問の中から、よくある質問への回答を FDELPHIのメンバーがまとめたものです。 したがって、これらの回答はボーランド株式会社がサポートする公式のものではなく、掲示されている内容についての問い合わせは受けられない場合があります。
Copyright 1996-1998 Delphi Users' ForumFAQ編纂委員会
|