1

コマンドラインにパスが含まれている場合、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.

結果は偽です。

コマンドラインにパスを含めるにはどうすればよいですか?

4

3 に答える 3

4

パスに問題があるときはいつでも、次のいずれかです

  1. パスにはスペースが含まれており、引用符で囲む必要があります
  2. パス内のバックスラッシュはエスケープ文字のように扱われ、'\' を 2 つにする必要があります
于 2010-04-05T12:23:22.663 に答える
4

ParamStr(0) や Path の値などのデバッグ情報を提供すると、独自の答えが見つかると思います。ここにエラーがあると思います: ParamStr(0) + ExtractFilePath(ParamStr(0))

したがって、アプリが c:\apps\foo.exe の場合、効果的に次のように呼び出します。 ExecProcess('c:\apps\foo.exec:\apps\');

それはあなたが望んでいたことではないと思います。ただ、何をしているのかは口にしないので、確かなことはわかりませんが…。

于 2010-04-05T12:23:56.743 に答える
2

Chris が述べたように、2 つの値を (間にスペースを入れずに) 1 つの長い文字列に連結しています。`c:\apps\foo.exec:\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 キャストは必要ありません。

于 2010-04-05T12:43:25.570 に答える