cs_barrique
Messages postés13Date d'inscriptionlundi 7 février 2005StatutMembreDernière intervention 7 mai 2018
-
30 nov. 2007 à 15:53
cs_barrique
Messages postés13Date d'inscriptionlundi 7 février 2005StatutMembreDernière intervention 7 mai 2018
-
4 déc. 2007 à 09:29
Bonjour,
Je vous écrit car j'ai un petit problème avec l'instruction WaitForSingleObject.
J'ai un programme delphi qui permet l'installation de plusieurs mises à jour, j'ai donc utiliser WaitForSingleObject pour attendre la fin de la dernière mises à jour pour lancer la suivante.
Le problème est que mon code fonctionne très bien lorsque je le teste sur mon disque dur ou sur le réseau, par contre une fois qu'il est gravé sur un cd cela ne fonctionne plus du tout : les mises à jour se lancent toutes en mêmes temps ...
Je ne comprend pas pourquoi cela fonctionne très bien en local et pas sur le cd
Merci pour vos réponses
Voici le code utilisé
function LanceAppliAttenteFin(NomFichier:string; var ExitCode: DWORD):boolean ;
var
StartInfo : TStartupInfo;
ProcessInfo : TProcessInformation;
begin
result:=true;
ZeroMemory(@StartInfo, sizeof(StartInfo));
StartInfo.cb:=sizeof(StartInfo);
if CreateProcess(nil,PChar(NomFichier),nil,nil,true,0,nil,nil,StartInfo,ProcessInfo) then
begin
Windows.WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
Windows.GetExitCodeProcess(ProcessInfo.hProcess,ExitCode);
end
else result:=false;
end;
cs_barrique
Messages postés13Date d'inscriptionlundi 7 février 2005StatutMembreDernière intervention 7 mai 2018 4 déc. 2007 à 09:29
Bonjour,
J'ai pris note des remarques que j'ai apporté dans ma fonction.
Par contre, je viens d'avoir l'explication de mon problème : je me servais de cette fonction pour lancer un installeur, or lorsque cet installeur est situé sur un support amovible, il se copie sur le disque dur, laisse la main, et s'exécute ensuite. Donc la fonction me disait que tout était terminé alors que l'exécutable du disque dur était toujours en cours.
C'est pour cela aussi que cela fonctionnait correctement à partir du lecteur réseau.
cs_barrique
Messages postés13Date d'inscriptionlundi 7 février 2005StatutMembreDernière intervention 7 mai 2018 3 déc. 2007 à 14:35
Bonjour cirec,
J'ai testé la 2ème solution et j'ai le même problème.
En +, elle ne me conviendrait pas car j'atend un code retour de l'application que je lance et c'est moins fiable que de passer par un CreateProcess
Je continue à chercher mais en vain jusqu'à maintenant
Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
WhiteHippo
Messages postés1154Date d'inscriptionsamedi 14 août 2004StatutMembreDernière intervention 5 avril 20123 4 déc. 2007 à 02:22
Bonsoir,
Quelques remarques et idées juste en passant :
Un ZeroMemory(@ProcessInfo, sizeof(TProcessInformation)); serait le bien venu.
La libération des handles alloués également :
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
Il serait plus normal d'initialiser au début de la fonction la variable result à false et ne la mettre à true après Windows.GetExitCodeProcess(ProcessInfo.hProcess,ExitCode);
La variable lpCurrentDirectory ne devrait pas etre initialisée à autre chose que nil ? car actuellement elle pointe sur le lecteur cdrom protégé en écriture... Qui sait ?
As tu vérifié la valeur de retour de WaitForSingleObject ? Pas de WAIT_FAILED par exemple en retour ?
De quel façon sont lancées les mises à jour ?
Cordialement.
<hr />"L'imagination est plus importante que le savoir." Albert Einstein