Run only one instance of your application
The question on how to make sure that your application is only started once by your users can be approached in several ways.
1. Using mutexes 2. Using FindWindow WinAPI
Using mutexes
Dalton Pulsipher says: "We use a MuteX object to do this. Just attach one to your program and on startup check if it already exists on the system. Here is the code if you want to go that route."
In the SRC file:
Procedure Exit_Application If (ghMuteX) Move (CloseHandle(ghMutex)) to giTemp Forward Send Exit_Application End_Procedure
//In a package that gets hit on startup:
Handle ghMuteX
#IFNDEF Get_CreateMuteX External_Function CreateMuteX "CreateMutexA" Kernel32.dll Integer i1 Integer i2 Integer i3 Returns Integer #ENDIF
#IFNDEF Get_CloseHandle External_Function CloseHandle "CloseHandle" Kernel32.dll Integer i1 Returns Integer #ENDIF
// CLIENT and SERVER Procedure Create_MuteX_Object Integer iVoid iErr String sID Move "Unique String For My Application" To sID Move (CreateMuteX(0,1,AddressOf(sID))) To ghMuteX If (ghMuteX <> ERROR_INVALID_HANDLE) Begin Move (GetLastError()) To iErr If (iErr = ERROR_ALREADY_EXISTS) Begin // program is already // running Move (CloseHandle(ghMuteX)) To iVoid Move 0 To ghMuteX // kill the application here if you do not want to allow // multiple instances End Else Send None // program is not already running End Else Send None // rare error; object could not be created End_Procedure // Create_MuteX_Object
Send Create_MuteX_Object
Using FindWindow WinAPI
Usage in SRC:
Use myPanel,pkg Object Main is a myPanel
Source myPanel.pkg
//////////////////////////////////////////// // // 05/24/2007 // Panel Class from Pieter van Dieren to check // to make sure program is only run one time. // /////////////////////////////////////////////
Use dfPanel.pkg
Class myPanel is a Panel
// DoCheckProgramActive // Checks if the program already is active. // If so, it activates the running application and closes this one. Procedure DoCheckProgramActive String sTitle Handle hWnd Integer iVoid
Register_Object Main Get Label of Main to sTitle
Move (FindWindow("",sTitle)) to hWnd If (hWnd) Begin Send Stop_Box (sTitle + " Already is Running and Can only be Started Once.") "Error:" Move (ShowWindow(hWnd,SW_MAXIMIZE)) to iVoid // 9 =SW_RESTORE SW_NORMAL Move (SetForegroundWindow(hWnd)) to iVoid Abort End End_Procedure // DoCheckProgramActive
// End_Construct_Object Procedure End_Construct_Object Send DoCheckProgramActive Forward Send End_Construct_Object End_Procedure // End_Construct_Object
End_class