Fórum CreateProcess #260772
01/12/2004
0
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
Curtir tópico
+ 0Posts
01/12/2004
Rômulo Barros
1 2 3 4 5 | procedure TForm1.Button1Click(Sender: TObject); begin WinExec(´C:\WINNT\Notepad.exe´,SW_SHOWNORMAL); Application.Terminate; end; |
Gostei + 0
01/12/2004
Tenil
é exatamente isso que quero fazer. Só que usando CreateProcess.
Tem jeito?
Obrigado.
Gostei + 0
01/12/2004
Tenil
1 2 | WinExec(´C:\WINNT\Notepad.exe´,SW_SHOWNORMAL); Application.Terminate; |
O Bloco de notas é aberto, mas a plicação não finaliza.
Gostei + 0
01/12/2004
Bruno Belchior
1 | Application.Terminate; |
Gostei + 0
01/12/2004
Vinicius2k
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+
Gostei + 0
01/12/2004
Tenil
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; |
1 2 3 | if ExecAndWait(´c:\arquivos de programas\itej\membros\atualizador.exe´, ´/2´, SW_SHOW) then Application.Terminate; end; |
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.
Gostei + 0
01/12/2004
Vinicius2k
1 | CmdLine := ´"´ + Filename + ´"´ + Params; |
Tente alterar para :
1 | CmdLine:= ´"´+FileName + ´ ´ + Params´"´; |
OK?
T+
Gostei + 0
01/12/2004
Tenil
Gostei + 0
01/12/2004
Vinicius2k
Tente isso também :
1 | CmdLine := Filename + ´ ´ + Params; |
Estou ´chutando´... não sei, na verdade, o que poderia ser...
T+
Gostei + 0
01/12/2004
Tenil
Essas coisas só acontecem comigo???
Gostei + 0
01/12/2004
Vinicius2k
1 | CmdLine := ´"´ + Filename + ´"´ + Params; |
Faça um teste simples :
1 | ExecAndWait(´c:\windows\notepad.exe´, ´< nome de um arquivo .txt>´, SW_SHOW); |
T+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)