CreateProcess

Delphi

01/12/2004

Olá colegas, preciso executar um programa externo sem aguardar o sei término.

Procurei aqui no fórum e só encontrei a função [b:a4be35d6e4]ExecAndWait[/b:a4be35d6e4]. Esta não me serve, pois preciso que, ao executar o outro programa, o que o chamou seja finalizado.

pelo que pude entender, devo usar a função [b:a4be35d6e4]CreateProcesss[/b:a4be35d6e4], mas infelizmente não estou conseguinto usá-la.

Por favor, ajudem-me.

Desde já, agradeço.


Tenil

Tenil

Curtidas 0

Respostas

Rômulo Barros

Rômulo Barros

01/12/2004

Será que é isto ou estou enganado:

procedure TForm1.Button1Click(Sender: TObject);
begin
   WinExec(´C:\WINNT\Notepad.exe´,SW_SHOWNORMAL);
   Application.Terminate;
end;



GOSTEI 0
Tenil

Tenil

01/12/2004

Undeclared Identifier,

é exatamente isso que quero fazer. Só que usando CreateProcess.

Tem jeito?

Obrigado.


GOSTEI 0
Tenil

Tenil

01/12/2004

Quando faço:

WinExec(´C:\WINNT\Notepad.exe´,SW_SHOWNORMAL); 
Application.Terminate; 


O Bloco de notas é aberto, mas a plicação não finaliza.


GOSTEI 0
Bruno Belchior

Bruno Belchior

01/12/2004

a linha:
Application.Terminate;
só vai executar após o usuário fechar o NotePad


GOSTEI 0
Vinicius2k

Vinicius2k

01/12/2004

Colega,

Se a função [b:e3c3b5407e]ExecAndWait[/b:e3c3b5407e] que vc está tentando utilizar for esta, ou parecida com esta, basta inibir nela a chamada à [b:e3c3b5407e]WaitForSingleObject[/b:e3c3b5407e];
function ExecAndWait(const FileName, Params: string;
  const WindowState: Word): boolean;
var SUInfo: TStartupInfo;
    ProcInfo: TProcessInformation;
    CmdLine: string;
begin
  CmdLine := ´"´ + Filename + ´"´ + Params;
  FillChar(SUInfo, SizeOf(SUInfo), #0);
  with SUInfo do begin
    cb := SizeOf(SUInfo);
    dwFlags := STARTF_USESHOWWINDOW;
    wShowWindow := WindowState;
  end;
  Result := CreateProcess(nil, PChar(CmdLine), nil, nil, false,
            CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
            PChar(ExtractFilePath(Filename)), SUInfo, ProcInfo);
// aqui -> if Result then begin
// aqui ->    WaitForSingleObject(ProcInfo.hProcess, INFINITE);
// aqui -> end;
end;


Após a chamada de [b:e3c3b5407e]ExecAndWait(...)[/b:e3c3b5407e], chame [b:e3c3b5407e]Application.Terminate;[/b:e3c3b5407e]
if ExecAndWait(´c:\windows\notepad.exe´, ´´, SW_SHOW) then 
  Application.Terminate;


Espero ter ajudado...
T+


GOSTEI 0
Tenil

Tenil

01/12/2004

Vinicius2K,

funcionou como você disse.

Só que agora está ocorrendo outro probleminha.

Não estou conseguindo passar os parâmetros para o programa externo.

Já tentei assim:

  if ExecAndWait(´c:\arquivos de programas\itej\membros\atualizador.exe´, ´-2´, SW_SHOW) then
    Application.Terminate;
  end;
Asim:
  if ExecAndWait(´c:\arquivos de programas\itej\membros\atualizador.exe´, ´/2´, SW_SHOW) then
    Application.Terminate;
  end;
Assim:
  if ExecAndWait(´c:\arquivos de programas\itej\membros\atualizador.exe /2´, ´´, SW_SHOW) then
    Application.Terminate;
  end;


E nada.

Quando não passo parâmetro funciona normalmente.
O problema é que preciso passar o parâmetro.

De qualquer forma, obrigado pela sua colaboração.


GOSTEI 0
Vinicius2k

Vinicius2k

01/12/2004

Humm... eu não uso esta função, mas me parece que aqui existe um problema :
CmdLine := ´"´ + Filename + ´"´ + Params;

Tente alterar para :
  CmdLine:= ´"´+FileName + ´ ´ + Params´"´;


OK?

T+


GOSTEI 0
Tenil

Tenil

01/12/2004

:cry: Também tentei isso, e nada...


GOSTEI 0
Vinicius2k

Vinicius2k

01/12/2004

Vc sabe exatamente como esta aplicação externa ´deseja´ receber os parametros? pq vc precisa passá-los exatamente como a aplicação espera...

Tente isso também :
CmdLine := Filename + ´ ´ + Params;


Estou ´chutando´... não sei, na verdade, o que poderia ser...

T+


GOSTEI 0
Tenil

Tenil

01/12/2004

Porque, eu me pergunto, porque, meu Deus???

Essas coisas só acontecem comigo???


GOSTEI 0
Vinicius2k

Vinicius2k

01/12/2004

Testei a função aqui e ela realmente funciona com o código original :
CmdLine := ´"´ + Filename + ´"´ + Params;


Faça um teste simples :
ExecAndWait(´c:\windows\notepad.exe´, ´<nome de um arquivo .txt>´, SW_SHOW);


T+


GOSTEI 0
POSTAR