Public Function IsAlreadyRunning() As Boolean
Dim hMap As Long
Dim pMem As Long
Dim hPid As Long
'# Nous tentons ici d'acceder au mappage (précedemment créé ?)
hMap = OpenFileMapping(FILE_MAP_READ, 0, App.Title)
If hMap <> 0 Then
'# L'application est déjà lancée.
pMem = MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0)
If pMem <> 0 Then
'# On récupère le handle vers la précédente fenêtre
CopyMemory hPid, ByVal pMem, 4
If hPid Then
On Error Resume Next
'# On active l'instance précedente
AppActivate hPid
On Error GoTo 0
End If
UnmapViewOfFile pMem
End If
'# On libère le handle hmap
CloseHandle hMap
'# et on prévient l'appelant que l'application avait dejà été lancée.
IsAlreadyRunning = True
Else
'# Nous sommes dans la première instance de l'application.
'# Nous allons laisser une marque en mémoire, pour l'indiquer
hMap = CreateFileMapping(INVALID_HANDLE_VALUE, ByVal 0&, PAGE_READWRITE, 0, 4, App.Title)
If hMap <> 0 Then
'# On ouvre le 'fichier' en écriture
pMem = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0)
If pMem <> 0 Then
'# On y écrit le process courant
CopyMemory ByVal pMem, GetCurrentProcessId(), 4
UnmapViewOfFile pMem
End If
'# Pas de CloseHandle hMap ici, sous peine de détruire le mappage lui-même...
End If
End If
End Function