Bonjour,
J'ai deux programmes (Delphi). Un programme B qui est un batch et qui a au début de son code les lignes suivantes
qui évitent que l'on puisse le lancer une seconde fois, si une instance de ce programme a déja été lancée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SetLastError(NO_ERROR); CreateMutex (nil, False, 'Programme_B'); if GetLastError = ERROR_ALREADY_EXISTS then Exit;
Je dois effectuer un programme A de type console qui puisse en autre executer manuellement ce programme B, afin de réaliser cette fonction j'ai codé les lignes suivantes
Ma Question : En procédant de cette manière , il m'a été impossible de lancer le programme B, ou plutôt je me suis rendu compte que la gestion du
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 function LancementDuProgramme_B:integer; var StartInfo: TStartupInfo; ProcessInfo: TProcessInformation; vl_CodeRetour: dword; vl_batch: string; begin result:=-1; { Mise à zéro de la structure StartInfo } FillChar(StartInfo, SizeOf(StartInfo), #0); { Seule la taille est renseignée, toutes les autres options } { laissées à zéro prendront les valeurs par défaut } StartInfo.cb := SizeOf(StartInfo); vl_batch := 'c:\emplacement_du_prog_B\Programme_B'; { Lancement de la ligne de commande } if CreateProcess(nil, Pchar(vl_param), nil, nil, False, 0, nil, nil, StartInfo, ProcessInfo) then begin { L'application est bien lancée, on va en attendre la fin } { ProcessInfo.hProcess contient le handle du process principal de l'application } WaitForSingleObject(ProcessInfo.hProcess, INFINITE); GetExitCodeProcess(ProcessInfo.hProcess, vl_CodeRetour); // MessageDlg('Le code retour du programme_B est ' + //inttostr(vl_CodeRetour, mtWarning, [mbOK], 0); result:=CodeRetour; end else RaiseLastOSError; end;
mutex dans le programme B qui fonctionne correctement lorsque le batch est lancé en lançant son propre exe, ne fonctionnait plus lorsque ce même
programme était lancé par un create process du programme A.
Mes compétences étant limitées sur ce sujet, avez vous une explication sur le
problème que je rencontre ?
Pour contourner ce problème, j'ai du dans le programme B supprimer la gestion du mutex. (Résultat : Mon prog A peut bien lancer le prog B et récupérer son code retour, mais le lancement unique du programme B n"est plus assuré)
En vous remerciant.
A+
---------------------------------------------------------------------
Ma config * Delphi 7.1 Entreprise / SQL Serveur 2000 / Windows 2000
Partager