Attendre la fermeture d'un programme déjà ouvert

Serial326 Messages postés 3 Date d'inscription mercredi 14 septembre 2005 Statut Membre Dernière intervention 1 août 2007 - 6 avril 2006 à 00:19
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 - 18 avril 2006 à 12:13
Bonjour à tous,

J'essai de faire un programme qui reçoit en paramètres le handle et le processus de l'application qui l'appelle ainsi que deux chemin (l'un d'un programme sur un poste, l'autre du même programme sur un serveur). Il fait alors une mise à jour lorsque les versions sont différentes.

Le problème est que en windows 98, il n'attend pas la fermeture du programme appelant et donc je ne peux pas copier mon fichier étant donnée qu'il est déjà ouvert. Par contre, il fonctionne très bien en Windows XP.

Quelqu'un peut-il m'aider?

Voici la partie du code qui pose problème :




var
NonOk : Boolean;
Mouvement :
SHFILEOPSTRUCT;
begin

.....


Hand := StrToInt(paramstr(1));
Processus:=StrToInt(paramstr(2));
VieilleApplication:=paramstr(3);
NouvelleApplication:=paramstr(4);

//Mets dans 'Memoire' le processus
Memoire :=
OpenProcess(STANDARD_RIGHTS_ALL,False,StrToInt64(Processus);

// Ferme l'application qui a appelé
sendmessage(Hand,WM_Close,0,0);

// Attend la fermeture de l'application
WaitForSingleObject(Memoire,
INFINITE);















// update du fichier si
nécessaire

if (VersionVieux <> VersionNeuf)
then

begin
// on utilise shfileoperation pour
ne pas ouvrir l'application trop rapidement
Mouvement.Wnd :=
Application.Handle;
Mouvement.wFunc :=
FO_COPY;
Mouvement.pFrom :=
PChar(NouvelleApplication);
Mouvement.pTo :=
PChar(VieilleApplication);
Mouvement.fFlags :=
FOF_NOCONFIRMATION;
Mouvement.fAnyOperationsAborted :=
NonOk;
try
SHFileOperation(Mouvement);
finally
if NonOk then
Showmessage('Erreur lors de la mise à jour');
end;
ShellExecute(handle,'open',PChar(VieilleApplication),'','',0);
CloseHandle(Memoire);
end;
end;

2 réponses

cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
14 avril 2006 à 19:01
Bin je vais essayer de te concocter un bout de code en partant de celui-ci.
L'idée est de boucler sur un sleep(10) et de parcourir la liste de processus à chaque passe.

Je te file ce que j'ai fait dans quelques temps.

procedure TfrmMain.btnKillNotepadClick(Sender: TObject);
var
//Info sur un processus
uProcessInfo: TProcessEntry32;
hHandle: THandle;
begin
//Il faut indiqué la taille de la structure dans la structure avant de l'utiliser
uProcessInfo.dwSize:= SizeOf(TProcessEntry32);
//Création d'un snapshot des processus en cours d'excution
hHandle:= CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
//Récupéation des infos du premier processus snapshoté
Process32First(hHandle, uProcessInfo);
//On boucle sur les processus
repeat
//Si c'est notre homme
if CompareText(uProcessInfo.szExeFile, 'notepad.exe') = 0 then
begin
//On demande un handle permettant de le supprimer
hHandle:= OpenProcess(PROCESS_ALL_ACCESS, False, uProcessInfo.th32ProcessID);
//On lui dit chut, avec le code d'erreur 0
TerminateProcess(hHandle, 0);
Break;
end;
until not Process32Next(hHandle, uProcessInfo);
end;
0
cs_rt15 Messages postés 3874 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 7 novembre 2014 13
18 avril 2006 à 12:13
Bon, vala déjà un code testé sous XP :

//______________________________________________________________________________
procedure TfrmMain.btnWaitForClick(Sender: TObject);
var
//Necessite TlHelp32 dans la clause uses
uProcessInfo: TProcessEntry32; //Infos sur un processus
hHandle: THandle; //Handle sur le snapshot
bLost: Boolean; //On ne trouve plus le processus ?
begin
//Pour entrer dans la boucle
bLost:= False;
//On boucle tant que le processus est trouvé
while (not bLost) do
begin
//On l'a pas encore trouvé
bLost:= True;
//Il faut indiqué la taille de la structure dans la structure avant de l'utiliser
uProcessInfo.dwSize:= SizeOf(TProcessEntry32);
//Création d'un snapshot des processus en cours d'excution
hHandle:= CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0);
//Récupéation des infos du premier processus snapshoté
Process32First(hHandle, uProcessInfo);
//On boucle sur les processus
repeat
//Si c'est notre homme
if CompareText(uProcessInfo.szExeFile, 'notepad.exe') = 0 then
begin
//On l'a trouvé
bLost:= False;
Break;
end;
until not Process32Next(hHandle, uProcessInfo);
//Pour ne pas consommer trops de CPU
Sleep(10);
//On peut mettre aussi un ProcessMessages si on prend les précautions nécessaires
end;
ShowMessage('Appli stopée');
end;
//______________________________________________________________________________

Il pas beaucoup plus de raison de marcher sous 98... Il faut en mettre une partie à la place de WaitForSingleObject(Memoire, INFINITE), en remplaçant 'notepad.exe' par le nom du processus dont on attend l'arrêt.
0
Rejoignez-nous