bonjour
j'essaie de savoir si mon application FRONT.mde est active ceci pour
eviter qu'elle ne soit lancée 2 x
j'ai essaié plusieur code avec App.PrevInstance trouvés sur le net et
apparament ça ne marche pas
j'ai trouve ce code qui fontionne tres bien mais avec vb
je voudrais l'adapter sur ma base access
quelqu'un paut -il adapter ce code pour qu'il fonctionne sur access merci
de
votre aide
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
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 OpenMutex Lib "kernel32" _
Alias "OpenMutexA" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Private Declare Function ReleaseMutex Lib "kernel32" _
(ByVal hMutex As Long) As Long
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const SYNCHRONIZE = &H100000
Private Const MUTANT_QUERY_STATE = &H1
Private Const MUTEX_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED _
Or SYNCHRONIZE Or MUTANT_QUERY_STATE
Dim lngMutex As Long
Private Sub Form_Load()
Dim ret As Long
'For this demo we use App.EXEName for the Mutex name,
'but you should use a name that will be really unique.
ret = OpenMutex(MUTEX_ALL_ACCESS, 0&, App.EXEName)
If ret Then
MsgBox "Votre Application est déja ouverte regardez dans la barre des
taches : " '& App.PrevInstance
Unload Me
Else
Dim sa As SECURITY_ATTRIBUTES
sa.nLength = Len(sa)
lngMutex = CreateMutex(sa, App.hInstance, App.EXEName)
'MsgBox "Mutex created " & lngMutex
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
If CBool(lngMutex) Then ReleaseMutex lngMutex
End Sub
bonjour
j'essaie de savoir si mon application FRONT.mde est active ceci pour
eviter qu'elle ne soit lancée 2 x
j'ai essaié plusieur code avec App.PrevInstance trouvés sur le net et
apparament ça ne marche pas
j'ai trouve ce code qui fontionne tres bien mais avec vb
je voudrais l'adapter sur ma base access
quelqu'un paut -il adapter ce code pour qu'il fonctionne sur access merci
de
votre aide
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
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 OpenMutex Lib "kernel32" _
Alias "OpenMutexA" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Private Declare Function ReleaseMutex Lib "kernel32" _
(ByVal hMutex As Long) As Long
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const SYNCHRONIZE = &H100000
Private Const MUTANT_QUERY_STATE = &H1
Private Const MUTEX_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED _
Or SYNCHRONIZE Or MUTANT_QUERY_STATE
Dim lngMutex As Long
Private Sub Form_Load()
Dim ret As Long
'For this demo we use App.EXEName for the Mutex name,
'but you should use a name that will be really unique.
ret = OpenMutex(MUTEX_ALL_ACCESS, 0&, App.EXEName)
If ret Then
MsgBox "Votre Application est déja ouverte regardez dans la barre des
taches : " '& App.PrevInstance
Unload Me
Else
Dim sa As SECURITY_ATTRIBUTES
sa.nLength = Len(sa)
lngMutex = CreateMutex(sa, App.hInstance, App.EXEName)
'MsgBox "Mutex created " & lngMutex
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
If CBool(lngMutex) Then ReleaseMutex lngMutex
End Sub
bonjour
j'essaie de savoir si mon application FRONT.mde est active ceci pour
eviter qu'elle ne soit lancée 2 x
j'ai essaié plusieur code avec App.PrevInstance trouvés sur le net et
apparament ça ne marche pas
j'ai trouve ce code qui fontionne tres bien mais avec vb
je voudrais l'adapter sur ma base access
quelqu'un paut -il adapter ce code pour qu'il fonctionne sur access merci
de
votre aide
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
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 OpenMutex Lib "kernel32" _
Alias "OpenMutexA" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Private Declare Function ReleaseMutex Lib "kernel32" _
(ByVal hMutex As Long) As Long
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const SYNCHRONIZE = &H100000
Private Const MUTANT_QUERY_STATE = &H1
Private Const MUTEX_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED _
Or SYNCHRONIZE Or MUTANT_QUERY_STATE
Dim lngMutex As Long
Private Sub Form_Load()
Dim ret As Long
'For this demo we use App.EXEName for the Mutex name,
'but you should use a name that will be really unique.
ret = OpenMutex(MUTEX_ALL_ACCESS, 0&, App.EXEName)
If ret Then
MsgBox "Votre Application est déja ouverte regardez dans la barre des
taches : " '& App.PrevInstance
Unload Me
Else
Dim sa As SECURITY_ATTRIBUTES
sa.nLength = Len(sa)
lngMutex = CreateMutex(sa, App.hInstance, App.EXEName)
'MsgBox "Mutex created " & lngMutex
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
If CBool(lngMutex) Then ReleaseMutex lngMutex
End Sub
Salut,
CreateMutex retourne le handle du mutex, s'il existe déjà. Il est
inutile, ici, d'utiliser OpenMutex.
Il manque un élément important, CloseHandle. Puisque le mutex est
possédé par le Kernel, le CloseHandle est important car autrement, le
Kernel
conservera le mutex actif (reference count non nul) et, la seconde fois
que
tu feras un test, le mutex sera reporté comme existant déjà, et ne
permettra
pas d'ouvrir l'application une seconde fois.
Essayer plutôt quelque chose du genre:
============================ > Option Compare Database
Option Explicit
Private Const ERROR_ALREADY_EXISTS = 183&
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA"
(ByVal lpAttributs As Long, _
ByVal InitialOwnwe As Long, ByVal lpName As String) As Long
Private Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As
Long)
As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As
Long)
As Long
Private Declare Function FormatMessage Lib "kernel32" Alias
"FormatMessageA"
_
(ByVal dwFlags As Long, _
lpSource As Any, _
ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, _
ByVal nSize As Long, _
Arguments As Long) As Long
-----------------------------------------------------------------
Public Function GetWin32ErrorDescription(ErrorNumber As Long) As String
' Convertir un numéro d'erreur en une description...
Const FORMAT_MESSAGE_FROM_SYSTEM As Long = 4096
Dim requiert As Long
Dim buffer As String
buffer = Space(4096)
requiert = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&,
ErrorNumber, 0, buffer, Len(buffer), 0)
GetWin32ErrorDescription = Left(buffer, requiert)
End Function
----------------------------------------------------------------
Public Sub TestMutex()
Const mutexName As String = "qwerty123"
Dim mu As Long
Dim errdll As Long
Dim released As Boolean
Err.Clear
mu = CreateMutex(0, 1, mutexName)
errdll = Err.LastDllError
If ERROR_ALREADY_EXISTS = errdll Then
Debug.Print mutexName, "Already exists"
released = CBool(ReleaseMutex(mu))
If Not released Then
Debug.Print Err.LastDllError, ,
GetWin32ErrorDescription(Err.LastDllError)
End If
Debug.Print "Released? ", released
CloseHandle mu
Exit Sub
Else
Debug.Print mutexName, "OK"
End If
' TestMutex ' appel récursif.
released = CBool(ReleaseMutex(mu))
If Not released Then
Debug.Print Err.LastDllError,
GetWin32ErrorDescription(Err.LastDllError)
End If
Debug.Print "Released? ", released
CloseHandle mu
End Sub
---------------------------------
Exécuter TestMutex. Tout devrait être bien. Décommenter la ligne
TestMutex qui fait un appel récursif (sur soi même), et réexécuter. En
ré-entrance, le mutex devrait constater qu'il existe déjà et ainsi,
brisera
la récursion, après avoir écrit "Already exists". Puisqu'on n'a pas pu
capturé le mutex, c'est le premier niveau de la récursion qui le possède,
le
release, à ce point, fait défaut, mais néanmoins, il ne faut pas oublier
le
CloseHandle, avant de faire le exit Sub, qui termine l'appel récursif. De
retour de l'appel récursif, le conde continue et cette fois-ci le release
fonctionnne (car cet handle a créé le mutex, avec 1 comme second argument,
ce qui lui assura la main mise sur le mutex) et on n'oublie quand même pas
le CloseHandle.
Dans ton cas, tu ne fais pas un appel récursif. Sur chargement de
l'application, ton code cesse là où on allait faire un appel récursif. Sur
exit de ton application, il te faut faire un release du handle du mutex
(que
tu auras sauvegardé avec précautions) et un close handle.
On voit tout de suite le problème avec cette approche: si
l'application
se termine brutalement (task manager), on ne peut la redémarrer
facilement,
sans redémarrer le PC... car le mutex a survécu à l'application, un mutex
étant la propriété du système d'exploitation. De plus, ne pas utiliser
qwerty123, comme nom, mais une chaîne de GUUID, si possible, mais cela, on
le sait probablement déjà.
Espérant être utile,
Vanderghast, Access MVP
"LOU" wrote in message
news:3f715c42$0$24157$bonjour
j'essaie de savoir si mon application FRONT.mde est active ceci pour
eviter qu'elle ne soit lancée 2 x
j'ai essaié plusieur code avec App.PrevInstance trouvés sur le net et
apparament ça ne marche pas
j'ai trouve ce code qui fontionne tres bien mais avec vb
je voudrais l'adapter sur ma base access
quelqu'un paut -il adapter ce code pour qu'il fonctionne sur access
merci
devotre aide
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
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 OpenMutex Lib "kernel32" _
Alias "OpenMutexA" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Private Declare Function ReleaseMutex Lib "kernel32" _
(ByVal hMutex As Long) As Long
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const SYNCHRONIZE = &H100000
Private Const MUTANT_QUERY_STATE = &H1
Private Const MUTEX_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED _
Or SYNCHRONIZE Or MUTANT_QUERY_STATE
Dim lngMutex As Long
Private Sub Form_Load()
Dim ret As Long
'For this demo we use App.EXEName for the Mutex name,
'but you should use a name that will be really unique.
ret = OpenMutex(MUTEX_ALL_ACCESS, 0&, App.EXEName)
If ret Then
MsgBox "Votre Application est déja ouverte regardez dans la barre
des
taches : " '& App.PrevInstance
Unload Me
Else
Dim sa As SECURITY_ATTRIBUTES
sa.nLength = Len(sa)
lngMutex = CreateMutex(sa, App.hInstance, App.EXEName)
'MsgBox "Mutex created " & lngMutex
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
If CBool(lngMutex) Then ReleaseMutex lngMutex
End Sub
Salut,
CreateMutex retourne le handle du mutex, s'il existe déjà. Il est
inutile, ici, d'utiliser OpenMutex.
Il manque un élément important, CloseHandle. Puisque le mutex est
possédé par le Kernel, le CloseHandle est important car autrement, le
Kernel
conservera le mutex actif (reference count non nul) et, la seconde fois
que
tu feras un test, le mutex sera reporté comme existant déjà, et ne
permettra
pas d'ouvrir l'application une seconde fois.
Essayer plutôt quelque chose du genre:
============================ > Option Compare Database
Option Explicit
Private Const ERROR_ALREADY_EXISTS = 183&
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA"
(ByVal lpAttributs As Long, _
ByVal InitialOwnwe As Long, ByVal lpName As String) As Long
Private Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As
Long)
As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As
Long)
As Long
Private Declare Function FormatMessage Lib "kernel32" Alias
"FormatMessageA"
_
(ByVal dwFlags As Long, _
lpSource As Any, _
ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, _
ByVal nSize As Long, _
Arguments As Long) As Long
-----------------------------------------------------------------
Public Function GetWin32ErrorDescription(ErrorNumber As Long) As String
' Convertir un numéro d'erreur en une description...
Const FORMAT_MESSAGE_FROM_SYSTEM As Long = 4096
Dim requiert As Long
Dim buffer As String
buffer = Space(4096)
requiert = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&,
ErrorNumber, 0, buffer, Len(buffer), 0)
GetWin32ErrorDescription = Left(buffer, requiert)
End Function
----------------------------------------------------------------
Public Sub TestMutex()
Const mutexName As String = "qwerty123"
Dim mu As Long
Dim errdll As Long
Dim released As Boolean
Err.Clear
mu = CreateMutex(0, 1, mutexName)
errdll = Err.LastDllError
If ERROR_ALREADY_EXISTS = errdll Then
Debug.Print mutexName, "Already exists"
released = CBool(ReleaseMutex(mu))
If Not released Then
Debug.Print Err.LastDllError, ,
GetWin32ErrorDescription(Err.LastDllError)
End If
Debug.Print "Released? ", released
CloseHandle mu
Exit Sub
Else
Debug.Print mutexName, "OK"
End If
' TestMutex ' appel récursif.
released = CBool(ReleaseMutex(mu))
If Not released Then
Debug.Print Err.LastDllError,
GetWin32ErrorDescription(Err.LastDllError)
End If
Debug.Print "Released? ", released
CloseHandle mu
End Sub
---------------------------------
Exécuter TestMutex. Tout devrait être bien. Décommenter la ligne
TestMutex qui fait un appel récursif (sur soi même), et réexécuter. En
ré-entrance, le mutex devrait constater qu'il existe déjà et ainsi,
brisera
la récursion, après avoir écrit "Already exists". Puisqu'on n'a pas pu
capturé le mutex, c'est le premier niveau de la récursion qui le possède,
le
release, à ce point, fait défaut, mais néanmoins, il ne faut pas oublier
le
CloseHandle, avant de faire le exit Sub, qui termine l'appel récursif. De
retour de l'appel récursif, le conde continue et cette fois-ci le release
fonctionnne (car cet handle a créé le mutex, avec 1 comme second argument,
ce qui lui assura la main mise sur le mutex) et on n'oublie quand même pas
le CloseHandle.
Dans ton cas, tu ne fais pas un appel récursif. Sur chargement de
l'application, ton code cesse là où on allait faire un appel récursif. Sur
exit de ton application, il te faut faire un release du handle du mutex
(que
tu auras sauvegardé avec précautions) et un close handle.
On voit tout de suite le problème avec cette approche: si
l'application
se termine brutalement (task manager), on ne peut la redémarrer
facilement,
sans redémarrer le PC... car le mutex a survécu à l'application, un mutex
étant la propriété du système d'exploitation. De plus, ne pas utiliser
qwerty123, comme nom, mais une chaîne de GUUID, si possible, mais cela, on
le sait probablement déjà.
Espérant être utile,
Vanderghast, Access MVP
"LOU" <colluluigi@skynet.be> wrote in message
news:3f715c42$0$24157$ba620e4c@reader0.news.skynet.be...
bonjour
j'essaie de savoir si mon application FRONT.mde est active ceci pour
eviter qu'elle ne soit lancée 2 x
j'ai essaié plusieur code avec App.PrevInstance trouvés sur le net et
apparament ça ne marche pas
j'ai trouve ce code qui fontionne tres bien mais avec vb
je voudrais l'adapter sur ma base access
quelqu'un paut -il adapter ce code pour qu'il fonctionne sur access
merci
de
votre aide
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
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 OpenMutex Lib "kernel32" _
Alias "OpenMutexA" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Private Declare Function ReleaseMutex Lib "kernel32" _
(ByVal hMutex As Long) As Long
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const SYNCHRONIZE = &H100000
Private Const MUTANT_QUERY_STATE = &H1
Private Const MUTEX_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED _
Or SYNCHRONIZE Or MUTANT_QUERY_STATE
Dim lngMutex As Long
Private Sub Form_Load()
Dim ret As Long
'For this demo we use App.EXEName for the Mutex name,
'but you should use a name that will be really unique.
ret = OpenMutex(MUTEX_ALL_ACCESS, 0&, App.EXEName)
If ret Then
MsgBox "Votre Application est déja ouverte regardez dans la barre
des
taches : " '& App.PrevInstance
Unload Me
Else
Dim sa As SECURITY_ATTRIBUTES
sa.nLength = Len(sa)
lngMutex = CreateMutex(sa, App.hInstance, App.EXEName)
'MsgBox "Mutex created " & lngMutex
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
If CBool(lngMutex) Then ReleaseMutex lngMutex
End Sub
Salut,
CreateMutex retourne le handle du mutex, s'il existe déjà. Il est
inutile, ici, d'utiliser OpenMutex.
Il manque un élément important, CloseHandle. Puisque le mutex est
possédé par le Kernel, le CloseHandle est important car autrement, le
Kernel
conservera le mutex actif (reference count non nul) et, la seconde fois
que
tu feras un test, le mutex sera reporté comme existant déjà, et ne
permettra
pas d'ouvrir l'application une seconde fois.
Essayer plutôt quelque chose du genre:
============================ > Option Compare Database
Option Explicit
Private Const ERROR_ALREADY_EXISTS = 183&
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA"
(ByVal lpAttributs As Long, _
ByVal InitialOwnwe As Long, ByVal lpName As String) As Long
Private Declare Function ReleaseMutex Lib "kernel32" (ByVal hMutex As
Long)
As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As
Long)
As Long
Private Declare Function FormatMessage Lib "kernel32" Alias
"FormatMessageA"
_
(ByVal dwFlags As Long, _
lpSource As Any, _
ByVal dwMessageId As Long, _
ByVal dwLanguageId As Long, _
ByVal lpBuffer As String, _
ByVal nSize As Long, _
Arguments As Long) As Long
-----------------------------------------------------------------
Public Function GetWin32ErrorDescription(ErrorNumber As Long) As String
' Convertir un numéro d'erreur en une description...
Const FORMAT_MESSAGE_FROM_SYSTEM As Long = 4096
Dim requiert As Long
Dim buffer As String
buffer = Space(4096)
requiert = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&,
ErrorNumber, 0, buffer, Len(buffer), 0)
GetWin32ErrorDescription = Left(buffer, requiert)
End Function
----------------------------------------------------------------
Public Sub TestMutex()
Const mutexName As String = "qwerty123"
Dim mu As Long
Dim errdll As Long
Dim released As Boolean
Err.Clear
mu = CreateMutex(0, 1, mutexName)
errdll = Err.LastDllError
If ERROR_ALREADY_EXISTS = errdll Then
Debug.Print mutexName, "Already exists"
released = CBool(ReleaseMutex(mu))
If Not released Then
Debug.Print Err.LastDllError, ,
GetWin32ErrorDescription(Err.LastDllError)
End If
Debug.Print "Released? ", released
CloseHandle mu
Exit Sub
Else
Debug.Print mutexName, "OK"
End If
' TestMutex ' appel récursif.
released = CBool(ReleaseMutex(mu))
If Not released Then
Debug.Print Err.LastDllError,
GetWin32ErrorDescription(Err.LastDllError)
End If
Debug.Print "Released? ", released
CloseHandle mu
End Sub
---------------------------------
Exécuter TestMutex. Tout devrait être bien. Décommenter la ligne
TestMutex qui fait un appel récursif (sur soi même), et réexécuter. En
ré-entrance, le mutex devrait constater qu'il existe déjà et ainsi,
brisera
la récursion, après avoir écrit "Already exists". Puisqu'on n'a pas pu
capturé le mutex, c'est le premier niveau de la récursion qui le possède,
le
release, à ce point, fait défaut, mais néanmoins, il ne faut pas oublier
le
CloseHandle, avant de faire le exit Sub, qui termine l'appel récursif. De
retour de l'appel récursif, le conde continue et cette fois-ci le release
fonctionnne (car cet handle a créé le mutex, avec 1 comme second argument,
ce qui lui assura la main mise sur le mutex) et on n'oublie quand même pas
le CloseHandle.
Dans ton cas, tu ne fais pas un appel récursif. Sur chargement de
l'application, ton code cesse là où on allait faire un appel récursif. Sur
exit de ton application, il te faut faire un release du handle du mutex
(que
tu auras sauvegardé avec précautions) et un close handle.
On voit tout de suite le problème avec cette approche: si
l'application
se termine brutalement (task manager), on ne peut la redémarrer
facilement,
sans redémarrer le PC... car le mutex a survécu à l'application, un mutex
étant la propriété du système d'exploitation. De plus, ne pas utiliser
qwerty123, comme nom, mais une chaîne de GUUID, si possible, mais cela, on
le sait probablement déjà.
Espérant être utile,
Vanderghast, Access MVP
"LOU" wrote in message
news:3f715c42$0$24157$bonjour
j'essaie de savoir si mon application FRONT.mde est active ceci pour
eviter qu'elle ne soit lancée 2 x
j'ai essaié plusieur code avec App.PrevInstance trouvés sur le net et
apparament ça ne marche pas
j'ai trouve ce code qui fontionne tres bien mais avec vb
je voudrais l'adapter sur ma base access
quelqu'un paut -il adapter ce code pour qu'il fonctionne sur access
merci
devotre aide
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
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 OpenMutex Lib "kernel32" _
Alias "OpenMutexA" (ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, ByVal lpName As String) As Long
Private Declare Function ReleaseMutex Lib "kernel32" _
(ByVal hMutex As Long) As Long
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const SYNCHRONIZE = &H100000
Private Const MUTANT_QUERY_STATE = &H1
Private Const MUTEX_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED _
Or SYNCHRONIZE Or MUTANT_QUERY_STATE
Dim lngMutex As Long
Private Sub Form_Load()
Dim ret As Long
'For this demo we use App.EXEName for the Mutex name,
'but you should use a name that will be really unique.
ret = OpenMutex(MUTEX_ALL_ACCESS, 0&, App.EXEName)
If ret Then
MsgBox "Votre Application est déja ouverte regardez dans la barre
des
taches : " '& App.PrevInstance
Unload Me
Else
Dim sa As SECURITY_ATTRIBUTES
sa.nLength = Len(sa)
lngMutex = CreateMutex(sa, App.hInstance, App.EXEName)
'MsgBox "Mutex created " & lngMutex
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
If CBool(lngMutex) Then ReleaseMutex lngMutex
End Sub