CreateProcess
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.
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
Curtidas 0
Respostas

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
01/12/2004
Undeclared Identifier,
é exatamente isso que quero fazer. Só que usando CreateProcess.
Tem jeito?
Obrigado.
é exatamente isso que quero fazer. Só que usando CreateProcess.
Tem jeito?
Obrigado.
GOSTEI 0

Tenil
01/12/2004
Quando faço:
O Bloco de notas é aberto, mas a plicação não finaliza.
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
01/12/2004
a linha:só vai executar após o usuário fechar o NotePad
Application.Terminate;
GOSTEI 0

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];
Após a chamada de [b:e3c3b5407e]ExecAndWait(...)[/b:e3c3b5407e], chame [b:e3c3b5407e]Application.Terminate;[/b:e3c3b5407e]
Espero ter ajudado...
T+
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
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:
Asim:
Assim:
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.
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;
if ExecAndWait(´c:\arquivos de programas\itej\membros\atualizador.exe´, ´/2´, SW_SHOW) then Application.Terminate; end;
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
01/12/2004
Humm... eu não uso esta função, mas me parece que aqui existe um problema :
Tente alterar para :
OK?
T+
CmdLine := ´"´ + Filename + ´"´ + Params;
Tente alterar para :
CmdLine:= ´"´+FileName + ´ ´ + Params´"´;
OK?
T+
GOSTEI 0

Tenil
01/12/2004
:cry: Também tentei isso, e nada...
GOSTEI 0

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 :
Estou ´chutando´... não sei, na verdade, o que poderia ser...
T+
Tente isso também :
CmdLine := Filename + ´ ´ + Params;
Estou ´chutando´... não sei, na verdade, o que poderia ser...
T+
GOSTEI 0

Tenil
01/12/2004
Porque, eu me pergunto, porque, meu Deus???
Essas coisas só acontecem comigo???
Essas coisas só acontecem comigo???
GOSTEI 0

Vinicius2k
01/12/2004
Testei a função aqui e ela realmente funciona com o código original :
Faça um teste simples :
T+
CmdLine := ´"´ + Filename + ´"´ + Params;
Faça um teste simples :
ExecAndWait(´c:\windows\notepad.exe´, ´<nome de um arquivo .txt>´, SW_SHOW);
T+
GOSTEI 0