Attendre fin de processus en delphi

stk -  
 h4mz4 -
Bonjour !

est-ce que quelqun sait s'il existe un equivalent en delphi à :
WaitForSingleObject(ProcessInformation.hProcess, INFINITE)
en effet ça ne fonctionne apparement pas sous win98

sous NT par contre ça marche, ça permet d'attendre que le processus lancé juste avant soit terminé.
voici une partie de mon code :

var
StartInfo : TStartupInfo;
ProcessInformation : TProcessInformation;
begin
if (FindExec('presentation.pps')='') then begin
lstat.Caption := 'Installation de la visionneuse...';
ZeroMemory(@StartInfo, sizeof(StartInfo)); // remplie de 0 StartInfo
StartInfo.cb:=sizeof(StartInfo);
if CreateProcess(nil,'PPView97.exe',nil,nil,true,0,nil,nil,StartInfo,ProcessInformation) then
WaitForSingleObject(ProcessInformation.hProcess, INFINITE)// attend que l'application désignée par le handle ProcessInformation.hProcess soit terminée
else
form1.close ;

lstat.Caption := 'Lancement de la présentation...';
ShellExecute(0,'OPEN','presentation.pps', Nil, Nil, SW_SHOW);
Form1.close
end else begin
lstat.Caption := 'Lancement de la présentation...';
ShellExecute(0,'OPEN','presentation.pps', Nil, Nil, SW_SHOW);
Form1.close
end;

end;

Merci par avance.
A voir également:

2 réponses

Ravachol Messages postés 566 Date d'inscription   Statut Membre Dernière intervention   120
 
Salut,
>est-ce que quelqun sait s'il existe un equivalent en delphi à :
>WaitForSingleObject(ProcessInformation.hProcess, INFINITE)
ben non car cela ne dépend pas de l'outil de dev, mais de l'API Windows.

Par contre sous W98 à quel moment cela ne fonctionne pas ?
Lors de la compil ou à l'éxecution ?

Je ne comprend pas bien non plus l'utilisation de ShellExecute, tu ne peut pas passer le nom de ta présentation en paramètre de ligne de cde lors de la création du process ex:
CreateProcess(nil,'PPView97.exe presentation.pps',nil,nil,true,0,nil,nil,StartInfo,ProcessInformation) ?

Car le WaitForSingleObject ne retourne comme son nom l'indique ;-) que lorsque le process passe à l'état signalé. Ce qui fait si j'en crois ton code que les instructions ShellExecute ne seront traitées que lorsque tu auras fermé la visionneuse => PB

Sinon je vois pas le Pb, mais ça fait un bout de temps que je n'ai pas bossé sous
Windows ...

Bon courage

Ni l'ignorance n'est défaut d'esprit,
ni le savoir n'est preuve de génie. LUC DE CLAPIERS
0
stk
 
Les instruction shellexecute doivent être executées juste aprés avoir installé la visionneuse. c'est à l'execution que ca plante (ca n'ouvre pas la visionneuse, ou plutot ça doit essayer de l'ouvrir mais pendant l'install donc ça ne fait rien...).
Par contre ça marche sous NT/2K et XP
0
h4mz4
 
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Memo1: TMemo;
Timer1: TTimer;
procedure Button1Click(Sender: TObject);
procedure Edit1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

var Si :STARTUPINFO;
Pi : PROCESS_INFORMATION ;

begin

zeromemory(@si,sizeof(STARTUPINFO));
Si.dwFlags:=STARTF_USESHOWWINDOW;
Si.wShowWindow:=SW_SHOWNORMAL;
CreateProcess(nil,pchar('cmd.exe /c del c:\out.txt'),nil,nil,True,
0,nil,nil,Si,Pi);
WaitForSingleObject(pi.hProcess,INFINITE);
CreateProcess(nil,pchar('cmd.exe /c '+edit1.text+'>>c:\out.txt'),nil,nil,True,
0,nil,nil,Si,Pi);
WaitForSingleObject(pi.hProcess,INFINITE);

Memo1.Lines.Add('Le handle du process est : '+intToStr(Pi.hProcess) ) ;
Memo1.Lines.Add('L''ID du process est : '+intToStr(Pi.dwProcessId) ) ;

WaitForSingleObject(pi.hProcess,INFINITE);

memo1.Lines.LoadFromFile('c:\out.txt');
end;

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin

if key=#13 then
begin
memo1.Lines.Clear;
button1.Click;
edit1.Text:='';
edit1.SetFocus;
end;
end;

end.
0