Run only one instance of your application: Difference between revisions
Run only one instance of your application (view source)
Revision as of 00:14, 11 December 2007
, 11 December 2007no edit summary
Hellboy1975 (talk | contribs) No edit summary |
Hellboy1975 (talk | contribs) No edit summary |
||
Line 1: | Line 1: | ||
The question on how to make sure that your application is only started once by your users can be approached in several ways. | The question on how to make sure that your application is only started once by your users can be approached in several ways. | ||
# Using mutexes | |||
# Using FindWindow WinAPI | |||
=== Using mutexes === | === Using mutexes === | ||
Line 11: | Line 11: | ||
In the SRC file within the panel object put this piece of code: | In the SRC file within the panel object put this piece of code: | ||
<pre> | |||
Procedure Exit_Application | |||
integer iVoid | integer iVoid | ||
If (ghMuteX) Move (CloseHandle(ghMutex)) to iVoid | If (ghMuteX) Move (CloseHandle(ghMutex)) to iVoid | ||
move 0 to ghMuteX | move 0 to ghMuteX | ||
Forward Send Exit_Application | Forward Send Exit_Application | ||
End_Procedure | |||
</pre> | |||
And in a package that gets hit on startup: | And in a package that gets hit on startup: | ||
<pre> | |||
// Constants | |||
Define ERROR_INVALID_HANDLE for 6 // taken from error.h of VS7 | |||
Define ERROR_ALREADY_EXISTS for 183<br/> | |||
Handle ghMuteX<br/> | |||
// external functions | |||
#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<br/> | |||
// function to create a mutex | |||
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 | |||
ABORT | |||
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<br/> | |||
// create the mutex | |||
Send Create_MuteX_Object | |||
</pre> | |||
=== Using FindWindow WinAPI === | === Using FindWindow WinAPI === | ||
Line 57: | Line 61: | ||
Usage in SRC: | Usage in SRC: | ||
<pre> | |||
Use myPanel,pkg | Use myPanel,pkg | ||
Object Main is a myPanel | Object Main is a myPanel | ||
</pre> | |||
Source myPanel.pkg | Source myPanel.pkg | ||
<pre> | |||
//////////////////////////////////////////// | //////////////////////////////////////////// | ||
// | // | ||
Line 99: | Line 104: | ||
End_Procedure // End_Construct_Object | End_Procedure // End_Construct_Object | ||
End_class | End_class | ||
</pre> | |||
The FindWindow technique is also discussed in the book [http://www.starzen.com/Products/DataFlexVDF/Books/tabid/56/Default.aspx Mastering Visual DataFlex] from Starzen. | The FindWindow technique is also discussed in the book [http://www.starzen.com/Products/DataFlexVDF/Books/tabid/56/Default.aspx Mastering Visual DataFlex] from Starzen. | ||
[[Category: | [[Category: Tutorials]] |