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?

Foi útil?

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, é

  1. O caminho tem espaços e precisa ser envolvido em cotações
  2. 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ê.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top