Как включить путь в командной строке? - PullRequest
1 голос
/ 05 апреля 2010

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 ]

4 голосов
/ 05 апреля 2010

Если вы предоставили некоторую информацию об отладке, такую ​​как значения ParamStr (0) и Path, я думаю, что вы найдете свой собственный ответ. Я думаю, что ошибка здесь: ParamStr (0) + ExtractFilePath (ParamStr (0))

Так что если ваше приложение c: \ apps \ foo.exe тогда вы будете эффективно звонить: ExecProcess ( 'C: \ Apps \ foo.exec: \ Apps \');

Не думаю, что ты этого хотел. Тем не менее, вы не говорите, что делаете, поэтому трудно знать наверняка ....

4 голосов
/ 05 апреля 2010

Всякий раз, когда у меня возникают проблемы с путями, это либо

  1. Путь содержит пробелы и должен быть заключен в кавычки
  2. Обратные слеши в пути обрабатываются как escape-символы и должны быть удвоены '\'
2 голосов
/ 05 апреля 2010

Как упоминал Крис, вы объединяете два значения (без пробела между ними) в одну длинную строку. Поскольку `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 обычно не требуется, так как компилятор будет неявно обрабатывать его за вас.

...