<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://dataflex.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Daver</id>
	<title>DataFlex Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://dataflex.wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Daver"/>
	<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Special:Contributions/Daver"/>
	<updated>2026-05-03T00:57:33Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Run_only_one_instance_of_your_application&amp;diff=3487</id>
		<title>Run only one instance of your application</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Run_only_one_instance_of_your_application&amp;diff=3487"/>
		<updated>2021-07-30T16:21:13Z</updated>

		<summary type="html">&lt;p&gt;Daver: /* Using FindWindow WinAPI */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The question on how to make sure that your application is only started once by your users can be approached in several ways.&lt;br /&gt;
&lt;br /&gt;
# Using mutexes&lt;br /&gt;
# Using FindWindow WinAPI&lt;br /&gt;
# Using Atoms&lt;br /&gt;
&lt;br /&gt;
=== Using mutexes ===&lt;br /&gt;
Dalton Pulsipher says:&lt;br /&gt;
&amp;quot;We use a MuteX object to do this.  Just attach one to your program and on &lt;br /&gt;
startup check if it already exists on the system.  &lt;br /&gt;
Here is the code if you want to go that route.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In the SRC file within the panel object put this piece of code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vdf&amp;quot;&amp;gt;&lt;br /&gt;
Procedure Exit_Application&lt;br /&gt;
    integer iVoid&lt;br /&gt;
    If (ghMuteX) Move (CloseHandle(ghMutex)) to iVoid&lt;br /&gt;
    move 0 to ghMuteX&lt;br /&gt;
    Forward Send Exit_Application&lt;br /&gt;
End_Procedure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And in a package that gets hit on startup:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vdf&amp;quot;&amp;gt;&lt;br /&gt;
// Constants&lt;br /&gt;
Define ERROR_INVALID_HANDLE        for 6    //  taken from error.h of VS7&lt;br /&gt;
Define ERROR_ALREADY_EXISTS        for 183&lt;br /&gt;
&lt;br /&gt;
Handle ghMuteX&lt;br /&gt;
&lt;br /&gt;
// external functions&lt;br /&gt;
#IFNDEF Get_CreateMuteX&lt;br /&gt;
    External_Function CreateMuteX &amp;quot;CreateMutexA&amp;quot; Kernel32.dll Integer i1 Integer i2 Integer i3 Returns Integer&lt;br /&gt;
#ENDIF&lt;br /&gt;
#IFNDEF Get_CloseHandle&lt;br /&gt;
   External_Function CloseHandle &amp;quot;CloseHandle&amp;quot; Kernel32.dll Integer i1 Returns Integer&lt;br /&gt;
#ENDIF&lt;br /&gt;
&lt;br /&gt;
// function to create a mutex&lt;br /&gt;
Procedure Create_MuteX_Object&lt;br /&gt;
   Integer iVoid iErr&lt;br /&gt;
   String sID&lt;br /&gt;
   Move &amp;quot;Unique String For My Application&amp;quot; To sID&lt;br /&gt;
   Move (CreateMuteX(0,1,AddressOf(sID))) To ghMuteX&lt;br /&gt;
   If (ghMuteX &amp;lt;&amp;gt; ERROR_INVALID_HANDLE) Begin&lt;br /&gt;
       Move (GetLastError()) To iErr&lt;br /&gt;
       If (iErr = ERROR_ALREADY_EXISTS) Begin  // program is already &lt;br /&gt;
                                               // running&lt;br /&gt;
           Move (CloseHandle(ghMuteX)) To iVoid&lt;br /&gt;
           Move 0 To ghMuteX&lt;br /&gt;
           // kill the application here if you do not want to allow &lt;br /&gt;
           // multiple instances&lt;br /&gt;
           ABORT&lt;br /&gt;
       End&lt;br /&gt;
       Else Send None  // program is not already running&lt;br /&gt;
   End&lt;br /&gt;
   Else Send None  // rare error; object could not be created&lt;br /&gt;
End_Procedure  // Create_MuteX_Object&lt;br /&gt;
&lt;br /&gt;
// create the mutex&lt;br /&gt;
Send Create_MuteX_Object&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dave Robinson says -&lt;br /&gt;
A warning: We found CodeJock skinning broke this, though YMMV.&lt;br /&gt;
&lt;br /&gt;
=== Using FindWindow WinAPI ===&lt;br /&gt;
&lt;br /&gt;
Leslie Brennan says:&lt;br /&gt;
&lt;br /&gt;
Usage in SRC:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vdf&amp;quot;&amp;gt;&lt;br /&gt;
 Use myPanel,pkg&lt;br /&gt;
 Object Main is a myPanel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Source myPanel.pkg&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vdf&amp;quot;&amp;gt;&lt;br /&gt;
 ////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 // 05/24/2007 &lt;br /&gt;
 // Panel Class from Pieter van Dieren to check&lt;br /&gt;
 // to make sure program is only run one time.&lt;br /&gt;
 //&lt;br /&gt;
 /////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
 Use dfPanel.pkg&lt;br /&gt;
&lt;br /&gt;
 Class myPanel is a Panel&lt;br /&gt;
    // DoCheckProgramActive&lt;br /&gt;
    // Checks if the program already is active.&lt;br /&gt;
    // If so, it activates the running application and closes this one.&lt;br /&gt;
      Procedure DoCheckProgramActive&lt;br /&gt;
        String sTitle&lt;br /&gt;
        Handle hWnd&lt;br /&gt;
        Integer iVoid&lt;br /&gt;
&lt;br /&gt;
        Register_Object Main&lt;br /&gt;
        Get Label of Main to sTitle&lt;br /&gt;
        Move (FindWindow(&amp;quot;&amp;quot;,sTitle))  to hWnd&lt;br /&gt;
        If (hWnd) Begin&lt;br /&gt;
          Send Stop_Box (sTitle + &amp;quot; Already is Running and Can only be Started Once.&amp;quot;) &amp;quot;Error:&amp;quot;&lt;br /&gt;
          Move (ShowWindow(hWnd,SW_MAXIMIZE)) to iVoid  // 9 =SW_RESTORE SW_NORMAL&lt;br /&gt;
          Move (SetForegroundWindow(hWnd)) to iVoid&lt;br /&gt;
          Abort&lt;br /&gt;
        End&lt;br /&gt;
      End_Procedure // DoCheckProgramActive&lt;br /&gt;
&lt;br /&gt;
      // End_Construct_Object&lt;br /&gt;
      Procedure End_Construct_Object&lt;br /&gt;
        Send DoCheckProgramActive&lt;br /&gt;
        Forward Send End_Construct_Object&lt;br /&gt;
      End_Procedure // End_Construct_Object&lt;br /&gt;
 End_class&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The FindWindow technique is also discussed in the book [http://starzen.com/products/books-and-magazines/mastering-visual-dataflex/ Mastering Visual DataFlex] from Starzen.&lt;br /&gt;
&lt;br /&gt;
Dave Robinson says:&lt;br /&gt;
The FindWindow method depends on the Title in the program taskbar being known and consistent.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category: Tutorials]]&lt;/div&gt;</summary>
		<author><name>Daver</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Run_only_one_instance_of_your_application&amp;diff=3486</id>
		<title>Run only one instance of your application</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Run_only_one_instance_of_your_application&amp;diff=3486"/>
		<updated>2021-07-30T16:18:55Z</updated>

		<summary type="html">&lt;p&gt;Daver: /* Using mutexes */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The question on how to make sure that your application is only started once by your users can be approached in several ways.&lt;br /&gt;
&lt;br /&gt;
# Using mutexes&lt;br /&gt;
# Using FindWindow WinAPI&lt;br /&gt;
# Using Atoms&lt;br /&gt;
&lt;br /&gt;
=== Using mutexes ===&lt;br /&gt;
Dalton Pulsipher says:&lt;br /&gt;
&amp;quot;We use a MuteX object to do this.  Just attach one to your program and on &lt;br /&gt;
startup check if it already exists on the system.  &lt;br /&gt;
Here is the code if you want to go that route.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In the SRC file within the panel object put this piece of code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vdf&amp;quot;&amp;gt;&lt;br /&gt;
Procedure Exit_Application&lt;br /&gt;
    integer iVoid&lt;br /&gt;
    If (ghMuteX) Move (CloseHandle(ghMutex)) to iVoid&lt;br /&gt;
    move 0 to ghMuteX&lt;br /&gt;
    Forward Send Exit_Application&lt;br /&gt;
End_Procedure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And in a package that gets hit on startup:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vdf&amp;quot;&amp;gt;&lt;br /&gt;
// Constants&lt;br /&gt;
Define ERROR_INVALID_HANDLE        for 6    //  taken from error.h of VS7&lt;br /&gt;
Define ERROR_ALREADY_EXISTS        for 183&lt;br /&gt;
&lt;br /&gt;
Handle ghMuteX&lt;br /&gt;
&lt;br /&gt;
// external functions&lt;br /&gt;
#IFNDEF Get_CreateMuteX&lt;br /&gt;
    External_Function CreateMuteX &amp;quot;CreateMutexA&amp;quot; Kernel32.dll Integer i1 Integer i2 Integer i3 Returns Integer&lt;br /&gt;
#ENDIF&lt;br /&gt;
#IFNDEF Get_CloseHandle&lt;br /&gt;
   External_Function CloseHandle &amp;quot;CloseHandle&amp;quot; Kernel32.dll Integer i1 Returns Integer&lt;br /&gt;
#ENDIF&lt;br /&gt;
&lt;br /&gt;
// function to create a mutex&lt;br /&gt;
Procedure Create_MuteX_Object&lt;br /&gt;
   Integer iVoid iErr&lt;br /&gt;
   String sID&lt;br /&gt;
   Move &amp;quot;Unique String For My Application&amp;quot; To sID&lt;br /&gt;
   Move (CreateMuteX(0,1,AddressOf(sID))) To ghMuteX&lt;br /&gt;
   If (ghMuteX &amp;lt;&amp;gt; ERROR_INVALID_HANDLE) Begin&lt;br /&gt;
       Move (GetLastError()) To iErr&lt;br /&gt;
       If (iErr = ERROR_ALREADY_EXISTS) Begin  // program is already &lt;br /&gt;
                                               // running&lt;br /&gt;
           Move (CloseHandle(ghMuteX)) To iVoid&lt;br /&gt;
           Move 0 To ghMuteX&lt;br /&gt;
           // kill the application here if you do not want to allow &lt;br /&gt;
           // multiple instances&lt;br /&gt;
           ABORT&lt;br /&gt;
       End&lt;br /&gt;
       Else Send None  // program is not already running&lt;br /&gt;
   End&lt;br /&gt;
   Else Send None  // rare error; object could not be created&lt;br /&gt;
End_Procedure  // Create_MuteX_Object&lt;br /&gt;
&lt;br /&gt;
// create the mutex&lt;br /&gt;
Send Create_MuteX_Object&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Dave Robinson says -&lt;br /&gt;
A warning: We found CodeJock skinning broke this, though YMMV.&lt;br /&gt;
&lt;br /&gt;
=== Using FindWindow WinAPI ===&lt;br /&gt;
&lt;br /&gt;
Leslie Brennan says:&lt;br /&gt;
&lt;br /&gt;
Usage in SRC:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vdf&amp;quot;&amp;gt;&lt;br /&gt;
 Use myPanel,pkg&lt;br /&gt;
 Object Main is a myPanel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Source myPanel.pkg&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vdf&amp;quot;&amp;gt;&lt;br /&gt;
 ////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 // 05/24/2007 &lt;br /&gt;
 // Panel Class from Pieter van Dieren to check&lt;br /&gt;
 // to make sure program is only run one time.&lt;br /&gt;
 //&lt;br /&gt;
 /////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
 Use dfPanel.pkg&lt;br /&gt;
&lt;br /&gt;
 Class myPanel is a Panel&lt;br /&gt;
    // DoCheckProgramActive&lt;br /&gt;
    // Checks if the program already is active.&lt;br /&gt;
    // If so, it activates the running application and closes this one.&lt;br /&gt;
      Procedure DoCheckProgramActive&lt;br /&gt;
        String sTitle&lt;br /&gt;
        Handle hWnd&lt;br /&gt;
        Integer iVoid&lt;br /&gt;
&lt;br /&gt;
        Register_Object Main&lt;br /&gt;
        Get Label of Main to sTitle&lt;br /&gt;
        Move (FindWindow(&amp;quot;&amp;quot;,sTitle))  to hWnd&lt;br /&gt;
        If (hWnd) Begin&lt;br /&gt;
          Send Stop_Box (sTitle + &amp;quot; Already is Running and Can only be Started Once.&amp;quot;) &amp;quot;Error:&amp;quot;&lt;br /&gt;
          Move (ShowWindow(hWnd,SW_MAXIMIZE)) to iVoid  // 9 =SW_RESTORE SW_NORMAL&lt;br /&gt;
          Move (SetForegroundWindow(hWnd)) to iVoid&lt;br /&gt;
          Abort&lt;br /&gt;
        End&lt;br /&gt;
      End_Procedure // DoCheckProgramActive&lt;br /&gt;
&lt;br /&gt;
      // End_Construct_Object&lt;br /&gt;
      Procedure End_Construct_Object&lt;br /&gt;
        Send DoCheckProgramActive&lt;br /&gt;
        Forward Send End_Construct_Object&lt;br /&gt;
      End_Procedure // End_Construct_Object&lt;br /&gt;
 End_class&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The FindWindow technique is also discussed in the book [http://starzen.com/products/books-and-magazines/mastering-visual-dataflex/ Mastering Visual DataFlex] from Starzen.&lt;br /&gt;
&lt;br /&gt;
[[Category: Tutorials]]&lt;/div&gt;</summary>
		<author><name>Daver</name></author>
	</entry>
	<entry>
		<id>https://dataflex.wiki/index.php?title=Run_only_one_instance_of_your_application&amp;diff=3485</id>
		<title>Run only one instance of your application</title>
		<link rel="alternate" type="text/html" href="https://dataflex.wiki/index.php?title=Run_only_one_instance_of_your_application&amp;diff=3485"/>
		<updated>2021-07-30T16:17:52Z</updated>

		<summary type="html">&lt;p&gt;Daver: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The question on how to make sure that your application is only started once by your users can be approached in several ways.&lt;br /&gt;
&lt;br /&gt;
# Using mutexes&lt;br /&gt;
# Using FindWindow WinAPI&lt;br /&gt;
# Using Atoms&lt;br /&gt;
&lt;br /&gt;
=== Using mutexes ===&lt;br /&gt;
Dalton Pulsipher says:&lt;br /&gt;
&amp;quot;We use a MuteX object to do this.  Just attach one to your program and on &lt;br /&gt;
startup check if it already exists on the system.  &lt;br /&gt;
Here is the code if you want to go that route.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
In the SRC file within the panel object put this piece of code:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vdf&amp;quot;&amp;gt;&lt;br /&gt;
Procedure Exit_Application&lt;br /&gt;
    integer iVoid&lt;br /&gt;
    If (ghMuteX) Move (CloseHandle(ghMutex)) to iVoid&lt;br /&gt;
    move 0 to ghMuteX&lt;br /&gt;
    Forward Send Exit_Application&lt;br /&gt;
End_Procedure&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And in a package that gets hit on startup:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vdf&amp;quot;&amp;gt;&lt;br /&gt;
// Constants&lt;br /&gt;
Define ERROR_INVALID_HANDLE        for 6    //  taken from error.h of VS7&lt;br /&gt;
Define ERROR_ALREADY_EXISTS        for 183&lt;br /&gt;
&lt;br /&gt;
Handle ghMuteX&lt;br /&gt;
&lt;br /&gt;
// external functions&lt;br /&gt;
#IFNDEF Get_CreateMuteX&lt;br /&gt;
    External_Function CreateMuteX &amp;quot;CreateMutexA&amp;quot; Kernel32.dll Integer i1 Integer i2 Integer i3 Returns Integer&lt;br /&gt;
#ENDIF&lt;br /&gt;
#IFNDEF Get_CloseHandle&lt;br /&gt;
   External_Function CloseHandle &amp;quot;CloseHandle&amp;quot; Kernel32.dll Integer i1 Returns Integer&lt;br /&gt;
#ENDIF&lt;br /&gt;
&lt;br /&gt;
// function to create a mutex&lt;br /&gt;
Procedure Create_MuteX_Object&lt;br /&gt;
   Integer iVoid iErr&lt;br /&gt;
   String sID&lt;br /&gt;
   Move &amp;quot;Unique String For My Application&amp;quot; To sID&lt;br /&gt;
   Move (CreateMuteX(0,1,AddressOf(sID))) To ghMuteX&lt;br /&gt;
   If (ghMuteX &amp;lt;&amp;gt; ERROR_INVALID_HANDLE) Begin&lt;br /&gt;
       Move (GetLastError()) To iErr&lt;br /&gt;
       If (iErr = ERROR_ALREADY_EXISTS) Begin  // program is already &lt;br /&gt;
                                               // running&lt;br /&gt;
           Move (CloseHandle(ghMuteX)) To iVoid&lt;br /&gt;
           Move 0 To ghMuteX&lt;br /&gt;
           // kill the application here if you do not want to allow &lt;br /&gt;
           // multiple instances&lt;br /&gt;
           ABORT&lt;br /&gt;
       End&lt;br /&gt;
       Else Send None  // program is not already running&lt;br /&gt;
   End&lt;br /&gt;
   Else Send None  // rare error; object could not be created&lt;br /&gt;
End_Procedure  // Create_MuteX_Object&lt;br /&gt;
&lt;br /&gt;
// create the mutex&lt;br /&gt;
Send Create_MuteX_Object&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Warning on Mutex by Dave Robinson&lt;br /&gt;
We found CodeJock skinning broke this&lt;br /&gt;
&lt;br /&gt;
=== Using FindWindow WinAPI ===&lt;br /&gt;
&lt;br /&gt;
Leslie Brennan says:&lt;br /&gt;
&lt;br /&gt;
Usage in SRC:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vdf&amp;quot;&amp;gt;&lt;br /&gt;
 Use myPanel,pkg&lt;br /&gt;
 Object Main is a myPanel&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Source myPanel.pkg&lt;br /&gt;
&amp;lt;source lang=&amp;quot;vdf&amp;quot;&amp;gt;&lt;br /&gt;
 ////////////////////////////////////////////&lt;br /&gt;
 //&lt;br /&gt;
 // 05/24/2007 &lt;br /&gt;
 // Panel Class from Pieter van Dieren to check&lt;br /&gt;
 // to make sure program is only run one time.&lt;br /&gt;
 //&lt;br /&gt;
 /////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
 Use dfPanel.pkg&lt;br /&gt;
&lt;br /&gt;
 Class myPanel is a Panel&lt;br /&gt;
    // DoCheckProgramActive&lt;br /&gt;
    // Checks if the program already is active.&lt;br /&gt;
    // If so, it activates the running application and closes this one.&lt;br /&gt;
      Procedure DoCheckProgramActive&lt;br /&gt;
        String sTitle&lt;br /&gt;
        Handle hWnd&lt;br /&gt;
        Integer iVoid&lt;br /&gt;
&lt;br /&gt;
        Register_Object Main&lt;br /&gt;
        Get Label of Main to sTitle&lt;br /&gt;
        Move (FindWindow(&amp;quot;&amp;quot;,sTitle))  to hWnd&lt;br /&gt;
        If (hWnd) Begin&lt;br /&gt;
          Send Stop_Box (sTitle + &amp;quot; Already is Running and Can only be Started Once.&amp;quot;) &amp;quot;Error:&amp;quot;&lt;br /&gt;
          Move (ShowWindow(hWnd,SW_MAXIMIZE)) to iVoid  // 9 =SW_RESTORE SW_NORMAL&lt;br /&gt;
          Move (SetForegroundWindow(hWnd)) to iVoid&lt;br /&gt;
          Abort&lt;br /&gt;
        End&lt;br /&gt;
      End_Procedure // DoCheckProgramActive&lt;br /&gt;
&lt;br /&gt;
      // End_Construct_Object&lt;br /&gt;
      Procedure End_Construct_Object&lt;br /&gt;
        Send DoCheckProgramActive&lt;br /&gt;
        Forward Send End_Construct_Object&lt;br /&gt;
      End_Procedure // End_Construct_Object&lt;br /&gt;
 End_class&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The FindWindow technique is also discussed in the book [http://starzen.com/products/books-and-magazines/mastering-visual-dataflex/ Mastering Visual DataFlex] from Starzen.&lt;br /&gt;
&lt;br /&gt;
[[Category: Tutorials]]&lt;/div&gt;</summary>
		<author><name>Daver</name></author>
	</entry>
</feed>