Fórum CreateProcess #260772

01/12/2004

0

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

Responder

Posts

01/12/2004

Rômulo Barros

Será que é isto ou estou enganado:

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



Responder

Gostei + 0

01/12/2004

Tenil

Undeclared Identifier,

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

Tem jeito?

Obrigado.


Responder

Gostei + 0

01/12/2004

Tenil

Quando faço:

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


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


Responder

Gostei + 0

01/12/2004

Bruno Belchior

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


Responder

Gostei + 0

01/12/2004

Vinicius2k

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];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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]
1
2
if ExecAndWait(´c:\windows\notepad.exe´, ´´, SW_SHOW) then
  Application.Terminate;


Espero ter ajudado...
T+


Responder

Gostei + 0

01/12/2004

Tenil

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:

1
2
3
if ExecAndWait(´c:\arquivos de programas\itej\membros\atualizador.exe´, ´-2´, SW_SHOW) then
  Application.Terminate;
end;
Asim:
1
2
3
if ExecAndWait(´c:\arquivos de programas\itej\membros\atualizador.exe´, ´/2´, SW_SHOW) then
  Application.Terminate;
end;
Assim:
1
2
3
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.


Responder

Gostei + 0

01/12/2004

Vinicius2k

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

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


OK?

T+


Responder

Gostei + 0

01/12/2004

Tenil

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


Responder

Gostei + 0

01/12/2004

Vinicius2k

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 :
1
CmdLine := Filename + ´ ´ + Params;


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

T+


Responder

Gostei + 0

01/12/2004

Tenil

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

Essas coisas só acontecem comigo???


Responder

Gostei + 0

01/12/2004

Vinicius2k

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


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


T+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar