Como incluir o caminho na linha de comando?
-
24-09-2019 - |
Pergunta
CreateProcess() retorna false quando a linha de comando contém um caminho. Não entendo o porquê.
Aqui simplifiquei a operação:
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.
O resultado é falso.
Como incluo o caminho na linha de comando?
Solução
Se você desse algumas informações de depuração, como os valores de Paramstr (0) e Path, acho que você encontraria sua própria resposta. Eu acho que o erro está aqui: Paramstr (0) + ExtractFilePath (paramstr (0))
Portanto, se o seu aplicativo for c: apps foo.exe, você vai efetivamente ligar: execprocess ('c: apps foo.exec: apps ');
Eu não acho que é isso que você queria. No entanto, você não diz o que está fazendo, então é difícil saber com certeza ....
Outras dicas
Sempre que tenho problemas com caminhos, é
- O caminho tem espaços e precisa ser envolvido em cotações
- As barracas no caminho estão sendo tratadas como personagens de escape e precisam ser dobradas ''
Como Chris mencionou, você está concatenando os dois valores (sem espaço entre eles) em uma longa string.Como `c:\apps\foo.exec:\apps\' provavelmente não é exatamente o que você pretendia, você provavelmente não deveria estar fazendo isso.
Além disso, se algum dos caminhos contiver espaços, pode ser necessário adicionar aspas duplas.O Delphi tem uma função no SysUtils justamente para esse propósito:
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;
Observe que, ao atribuir os dois valores a variáveis de string, a conversão de PChar geralmente não é necessária, pois o compilador irá lidar com isso implicitamente para você.