Как включить путь в командной строке?
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\');
Я не думаю, что это то, что вы хотели. Тем не менее, вы не говорите, что делаете, так что трудно знать наверняка....
Всякий раз, когда у меня есть проблемы с путями, это либо
- Путь содержит пробелы и должен быть заключен в кавычки
- Обратные слеши в пути обрабатываются как 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 обычно не требуется, так как компилятор будет неявно обрабатывать его за вас.