Mutex problème en exécution depuis vb erreur 288

xav33 Messages postés 7 Date d'inscription mardi 7 janvier 2003 Statut Membre Dernière intervention 6 mai 2005 - 6 mai 2005 à 18:24
cs_boutemine Messages postés 78 Date d'inscription dimanche 8 mai 2005 Statut Membre Dernière intervention 21 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

1 réponse

cs_boutemine Messages postés 78 Date d'inscription dimanche 8 mai 2005 Statut Membre Dernière intervention 21 mars 2018 2
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

et voici un sujet dans la wiki qui traite ce sujet
http://en.wikipedia.org/wiki/Mutex

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 -->
0
Rejoignez-nous