Attendre fin de processus en delphi

Fermé
stk - 9 juin 2004 à 10:54
 h4mz4 - 31 mars 2009 à 23:31
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.

2 réponses

Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 120
9 juin 2004 à 12:03
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
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
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