如何在命令行中包含路径?

时间:2010-04-05 12:02:42

标签: delphi winapi delphi-2009 createprocess

当命令行包含路径时,

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.

结果是错误的。

如何在命令行中包含路径?

3 个答案:

答案 0 :(得分:4)

每当我遇到路径问题时,都是

  1. 路径中包含空格,需要用引号括起来
  2. 路径中的反斜杠被视为转义字符,需要加倍'\'

答案 1 :(得分:4)

如果您提供了一些调试信息,例如ParamStr(0)和Path的值,我想您会找到自己的答案。 我认为错误在这里: ParamStr(0)+ ExtractFilePath(ParamStr(0))

因此,如果您的应用是c:\ apps \ foo.exe 然后你会有效地打电话: ExecProcess( 'C:\应用\ foo.exec:\应用\');

我认为这不是你想要的。但是,你没有说你正在做什么,所以很难确定......

答案 2 :(得分: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强制转换,因为编译器将隐式为您处理它。