2010-04-05 37 views
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

如果你给了一些调试信息,如ParamStr这(0)和路径的价值观,我想你会找到自己的答案。 我认为错误是在这里: ParamStr这(0)+ ExtractFilePath(ParamStr这(0))

所以,如果您的应用程序是c:\ APPS \ foo.exe的 那么你会得到有效的呼唤: ExecProcess( 'C:\应用\ foo.exec:\应用\');

我不认为这就是你想要的。然而,你并没有说你在做什么,所以很难确切知道......

4

每当我有路径的问题,则可能是

  1. 的路径中有空格它,需要用引号引用
  2. 在路径中的反斜杠被当作转义字符和需要加倍“\”
2

正如克里斯提到的,你将两个值连接起来(两个值之间没有空格)为一个长字符串。由于`c:\ apps \ foo.exec:\ apps \'可能不是您想要的,您可能不应该那样做。

此外,如果任一路径包含空格,则可能需要添加双引号。德尔福在只是为了这一目的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类型投通常是不必要的,因为编译器将隐为您处理。