xav33
Messages postés7Date d'inscriptionmardi 7 janvier 2003StatutMembreDernière intervention 6 mai 2005
-
6 mai 2005 à 18:24
cs_boutemine
Messages postés78Date d'inscriptiondimanche 8 mai 2005StatutMembreDernière intervention21 mars 2018
-
29 déc. 2007 à 21:47
Bonjour tout le monde,
J'utilise les fonctions createmutex et releasemutex pour bloquer le nombre d'instance de mon logiciel.
Quand je lance l'exe celà semble fonctionner parfaitement. Les mutex sont créés et supprimés. Je peux donc lancer l'appli, fermer, relancer sans problème.
Par contre si je suis en exécution depuis le source vb, releasemutex ne semble pas fonctionner (Erreur 288 : Tentative de libération d'un mutex dont l'appelant n'est pas propriétaire. ). Ce qui fait que je peux lancer une première fois mon appli. Le releasemutex me renvoi l'erreur ci-dessus. Je relance l'appli, le createmutex ne fonctionne pas car le précédent mutex est encore présent. Si je ferme et que je réouvre vb, je peux de nouveaux exécuter mon appli?
Est-ce que quelqu'un à déjà rencontré ce problème et aurais une idée de la solution à apporter.
Merci d'avance
cs_boutemine
Messages postés78Date d'inscriptiondimanche 8 mai 2005StatutMembreDernière intervention21 mars 20182 29 déc. 2007 à 21:47
j'ai rencontré le mème problème moi aussi dans le vb6.
je pense que la source est la dépendance entre l'application (aprés son compilation et exécution) et le studio (VB6).
c-a-d que la compilation en temps réel va créer un thread appartenant au processus du studio de développement et qui porte le meme nom du mutex du studio vb6 et tu n'as pas le droit de le modifié.
Encore, lorsque tu réalise le procédé de création, la libération ensuite n'est pas autorisée car la destruction n'est pas autorisée.
par contre, si tu refais la mème chose en vb.net, le problème ne se pose pas car l'application est indépandante du Processus du Studio de développement
donc la source du bug est la dépandance entre le studio VB6 et l'application compilée
le code pour ceux qui veullent apprendre la technique des mutexs
Option Explicit
'Fonctions API et Types des mutexs
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As Long) As Long
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Const ERROR_ALREADY_EXISTS as long = 183
Private m_hMutex As Long
'Cette fonction detecte si un mutex existe ou non
Public Function CheckMutex (MutexName As String) As Boolean
Dim S As SECURITY_ATTRIBUTES
m_hMutex = CreateMutex(S, 0, MutexName)
If Err.LastDllError = ERROR_ALREADY_EXISTS Then
CheckMutex = False
Else
CheckMutex = True
End If
End Function
'Destruction du mutex
Public Sub CloseMutex()
ReleaseMutex m_hMutex
CloseHandle m_hMutex
End Sub
'Dans la procedure de chargement de la fenetre
Private Sub Form_Load()
'Dans chaque processus, un mutex est créé automatiquement et qui prend le nom MyProg
If Not CheckMutex("MyPrg") Then
MsgBox "Application is running"
Unload Me
End If
End Sub
salutations
Ton amis Boutemine Oualid
j'attend votre réponse<!-- php buffer end -->