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. 路径中的反斜杠被视为转义字符,需要加倍'\'
于 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

正如克里斯所提到的,您将两个值(它们之间没有空格)连接成一个长字符串。由于 `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;

请注意,通过将这两个值分配给字符串变量,通常不需要 PChar 强制转换,因为编译器会为您隐式处理它。

于 2010-04-05T12:43:25.570 回答