Allowing only one instance of your program

- StPendl StPendl May 8, 2011

The Basics

Every now and then one wants to make sure that only one instance of his application is running to prevent problems with shared resources when multiple instances are run concurrently.

This is called mut ually ex clusive access, in short Mut-Ex or Mutex.

MSDN has a nice article about Mutex Objects , which you should read to get a general understanding of the subject.

The API functions involved

The CreateMutex function

The first function is the one we use to create a mutext, which is the CreateMutex Function
It receives the security attributes, initial owner and name of our mutex object to create.

We do not want to grant other processes or threads access to our mutex, so we use NULL for the security attributes.
We want to be the initial owner of the mutex to prevent subsequent instances of our program to be run, so we set that to TRUE = 1.
We select a unique name for our mutex to have it easily separated from other mutex objects.

Here is the code to do all of this.
 ' inherit the default security attributes 
lpMutexAttributes = _NULL

' optain initial ownership by setting this to 1
bInitialOwner = 1

' use a unique name for the mutex
lpName$ = "LBMutExDemo"

calldll #kernel32, "CreateMutexA",_
lpMutexAttributes as ulong,_
bInitialOwner as long, _
lpName$ as ptr,_
hMutex as ulong

The GetLastError function

The first second function is the one we use to create a mutext, check if our mutext is already in use, which is the GetLastError Function
It receives the security attributes, initial owner returns an error indicating that the mutex is already present, which is ERROR_ALREADY_EXISTS = 183.

If the mutex already exists, we do want our program to notify the user of this situation and name of our mutex object to create. We end gracefully.

Here is the code to do not want to grant other processes or threads access to our mutex, all of this.
 ' get the last error, so we use NULL for the security attributes. We want to be the initial owner of the mutex to prevent subsequent instances of our program to be run, so we set that to TRUE = 1. We select a unique name for our mutex to have it easily separated from other mutex objects. Here is the code to do all of this. ' inherit the default security attributes lpMutexAttributes = _NULL ' optain initial ownership by setting this to 1 bInitialOwner = 1 ' use a unique name for the mutex lpName$ = "LBMutExDemo" know if there is already an instance running 
calldll #kernel32, "CreateMutexA",_ lpMutexAttributes "GetLastError",_
LastError as ulong

' check if there is already an instance running (ERROR_ALREADY_EXISTS = 183)
if LastError = 183 then
calldll #kernel32, "CloseHandle",_
hMutex as ulong,_
bInitialOwner as long, _ lpName$ as ptr,_ hMutex as ulong result as long

' exit if there is already an instance running
notice "Exiting!"; chr$(13);_
"Another instance of this program is already running!"
end
end if

Third Part Title

Text here.
 'code here