どのようにパスをコマンドライン?
-
24-09-2019 - |
質問
CreateProcess()がfalseを返す場合、コマンドラインを含みます。かわからないうのではないでしょうか。
ここでは簡易操作:
function ExecProcess(path:string):boolean;
var StartupInfo:TstartupInfo;
ProcInfo:TProcessInformation;
begin
FillChar( StartupInfo, SizeOf( TStartupInfo ), 0 );
StartupInfo.cb := SizeOf( TStartupInfo );
Result:= CreateProcess(nil, PChar(path), Nil, Nil, False, 0, Nil, PChar(ExtractFilePath(path)),StartupInfo,ProcInfo);
end;
begin
ExecProcess(ParamStr(0) + ExtractFilePath(ParamStr(0)));
end.
結果はfalseです。
方法を含むパスをコマンドライン?
解決
あなたは、このようなParamStr(0)の値とパスなど、いくつかのデバッグ情報を与えた場合は、
は、私はあなたがあなた自身の答えを見つけるだろうと思います。 私は、エラーがここにあると思います: ParamStr(0)+ ExtractFilePath(ParamStr(0))
だからあなたのアプリは、Cの場合:\ APPS \ FOO.EXE あなたは効果的に呼び出すことになるだろう: ExecProcess( 'C:\ APPS \ foo.exec:\ APPS \');
私はそれはあなたが望んでいたものだとは思いません。それは確実に知ることは難しいので、しかし、あなたは、何をやっているなんて言わないで...。
他のヒント
いつも問題にパスするか
- のパスが空間で、ニーズに包まれるクォート
- バックスラッシュのパスに扱われるようにエスケープ文字とする必要が倍増し'\'
クリスは、前述のように、
、あなたは1つの長い文字列に(それらの間のスペースなし)2つの値を連結しています。 \ APPS \ foo.exec:: `C以来\ APPS \」おそらくあなたが意図かなりものではありません、あなたはおそらくそれを行うべきではありません。
パスのいずれかにスペースが含まれている場合、また、あなたは二重引用符を追加する必要があります。
:Delphiはちょうどその目的のためのsysutilsの中の機能を持っていますvar
AppPath, ExePath: string
begin
// Setup StartupInfo and ProcInfo as before. Omitted for brevity here.
ExePath := AnsiQuotedStr(ParamStr(0), '"');
AppPath := AnsiQuotedStr(ExtractFilePath(ExePath), '"');
Result:= CreateProcess(nil, ExePath, Nil, Nil, False, 0,
Nil, Apppath, StartupInfo, ProcInfo);
end;
コンパイラが暗黙的にあなたのためにそれを処理するなどの文字列変数に2つの値を割り当てることによって、PChar型のキャストは、通常は必要ではないこと注。
所属していません StackOverflow