Serial326
Messages postés3Date d'inscriptionmercredi 14 septembre 2005StatutMembreDernière intervention 1 août 2007
-
6 avril 2006 à 00:19
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDerniè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;
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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;
cs_rt15
Messages postés3874Date d'inscriptionmardi 8 mars 2005StatutModérateurDernière intervention 7 novembre 201413 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.