Как включить путь в командной строке?

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 ответа

Решение

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

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

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

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

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

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

Другие вопросы по тегам