=Allowing only one instance of your program=
//[[user:StPendl|1304860849]]//
[[toc]]
----
==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 [[@http://msdn.microsoft.com/en-us/library/ms684266(VS.85).aspx|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 [[@http://msdn.microsoft.com/en-us/library/ms682411(VS.85).aspx|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.

In return we get the Windows handle of the mutex, so we can access it at a later stage.

Here is the code to do all of this.
[[code format="lb"]]
    ' 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
[[code]]

===The GetLastError function===
The second function is the one we use to check if our mutext is already in use, which is the [[@http://msdn.microsoft.com/en-us/library/ms679360(VS.85).aspx|GetLastError Function]]
It 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 end gracefully.

Here is the code to do all of this.
[[code format="lb"]]
    ' get the last error, so we know if there is already an instance running
    calldll #kernel32, "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,_
            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
[[code]]

===The ReleaseMutex function===
The third function is the one we use to free our mutext before we end the program, which is the [[@http://msdn.microsoft.com/en-us/library/ms685066(VS.85).aspx|ReleaseMutex Function]]
It removes the ownership from the mutex.

This function must be called at the end of your program to be able to debug and run your program from within the LB editor.
If it happens, that your program crashes, while the mutex is active, you need to restart the LB editor to free the mutex.

Here is the code to do all of this.
[[code format="lb"]]
    ' free the mutex so it is no longer owned by this instance
    calldll #kernel32, "ReleaseMutex",_
        hMutex as ulong,_
        result as long
[[code]]

==Third Part Title==
Text here.
[[code format="lb"]]
'code here
[[code]]