Exe instance question

Just starting out? Need help? Post your questions and find answers here.
Cor
Enthusiast
Enthusiast
Posts: 124
Joined: Fri Apr 25, 2003 7:52 pm
Location: Netherlands
Contact:

Exe instance question

Post by Cor »

I have the following situation.

Start test.exe

Start the same program test.exe for the second time

The first instance must be closed and the second must be opened.

Is there a way to do this?
Cor de Visser

Registered PureBasic user

Author of ChordPlanet
Made with PureBasic
http://www.chordplanet.com
freak
PureBasic Team
PureBasic Team
Posts: 5929
Joined: Fri Apr 25, 2003 5:21 pm
Location: Germany

Post by freak »

If I remember right, there was a snipped on the Recource Site that does
that. Have a search there, maybe you find it.

You can also have a look at the source of the Editor. It behaves in a
similar way (if a second instance is opened, the second one get's closed)

Timo
quidquid Latine dictum sit altum videtur
Cor
Enthusiast
Enthusiast
Posts: 124
Joined: Fri Apr 25, 2003 7:52 pm
Location: Netherlands
Contact:

Post by Cor »

Thanks Freak
Cor de Visser

Registered PureBasic user

Author of ChordPlanet
Made with PureBasic
http://www.chordplanet.com
Berikco
Administrator
Administrator
Posts: 1326
Joined: Wed Apr 23, 2003 7:57 pm
Location: Belgium
Contact:

Post by Berikco »

Here an small example

Code: Select all

ERROR_ALREADY_EXISTS = 183
Global WM_ACTIVATEOLDINST
WM_ACTIVATEOLDINST = RegisterWindowMessage_("WM_ACTIVATEOLDINST_PB")
MutexName$ = "mylittletestapp"

Procedure MyWindowCallback(WindowID, Message, wParam, lParam)  
  Result = #PB_ProcessPureBasicEvents  
  If message = WM_ACTIVATEOLDINST
    CloseHandle_(hMutex)
    OpenConsole()
    PrintN("closing app")
    Delay(2000)
    End
  EndIf
  ProcedureReturn Result  
EndProcedure  

hMutex = CreateMutex_(0, 0, @MutexName$)
If GetLastError_() = ERROR_ALREADY_EXISTS 
  SendMessage_(#HWND_BROADCAST, WM_ACTIVATEOLDINST, 0, 0)
  Delay(100)
EndIf


If OpenWindow(0,100,150,450,200,#PB_Window_SystemMenu,"MyLittleTestApp " + Str(Random(500)))
  SetWindowCallback(@MyWindowCallback()) 
  Repeat
    ev=WaitWindowEvent()
  Until ev=#PB_EventCloseWindow
EndIf

If hMutex <> 0 
 CloseHandle_(hMutex)
EndIf

End
PB
PureBasic Expert
PureBasic Expert
Posts: 7581
Joined: Fri Apr 25, 2003 5:24 pm

Post by PB »

> Here an small example

Here's an even smaller example: :twisted:

Code: Select all

; These two lines prevent this app from being run more than once.
; You must put these lines at the start of your app's code (obviously).
MutexID=CreateMutex_(0,1,"YourAppName") : MutexError=GetLastError_()
If MutexID=0 Or MutexError<>0 : ReleaseMutex_(MutexID) : CloseHandle_(MutexID) : End : EndIf
;
; Your app's code now goes here, until quitting time, which executes the next line.
;
CloseHandle_(MutexID) : End
Berikco
Administrator
Administrator
Posts: 1326
Joined: Wed Apr 23, 2003 7:57 pm
Location: Belgium
Contact:

Re: Exe instance question

Post by Berikco »

PB wrote:> Here an small example

Here's an even smaller example:
Cor wrote:The first instance must be closed and the second must be opened.
No PB, you did not read the whole question, to fast again.
First closed.....second....
:mrgreen: :mrgreen: :mrgreen:
PB
PureBasic Expert
PureBasic Expert
Posts: 7581
Joined: Fri Apr 25, 2003 5:24 pm

Re: Exe instance question

Post by PB »

> No PB, you did not read the whole question, to fast again.
> First closed.....second....

Image
Thade
Enthusiast
Enthusiast
Posts: 266
Joined: Sun Aug 03, 2003 12:06 am
Location: Austria

Post by Thade »

Just for curiosity ...

What situation could make it worth to start the same program twice only to close the first one immediately after you started the second one?
Or did I miss the point somehow?
I mean: what can the same program do at its second start what it cannot do at first try?
--------------
Yes, its an Irish Wolfhound.
Height: 107 cm; Weight: 88 kg
dagcrack
Addict
Addict
Posts: 1868
Joined: Sun Mar 07, 2004 8:47 am
Location: Argentina
Contact:

Post by dagcrack »

Hmm Dunno! maybe his proggy is a trial release and each time you open it you have less runs to go ? :wink: Just wondering heh..
User avatar
Rescator
Addict
Addict
Posts: 1769
Joined: Sat Feb 19, 2005 5:05 pm
Location: Norway

Post by Rescator »

Here is a modification of the above code!
It let you do single instance running just like any "good" application!

Run the program, minimize the window. Then run it again!
If all goes well the program won't start again,
but instead message the old instance and restore it and bring it to the foreground!

Only tested on XP Pro, but should behave in a similar way on all windows versions. not entirely sure if W95 behave exactly the same or not, test to be sure!

Code: Select all

ERROR_ALREADY_EXISTS = 183
Global WM_ACTIVATEOLDINST
WM_ACTIVATEOLDINST = RegisterWindowMessage_("WM_ACTIVATEOLDINST_PB")
MutexName$ = "mylittletestapp"

Procedure MyWindowCallback(WindowID, message, wParam, lParam)
 Result = #PB_ProcessPureBasicEvents
 If message = WM_ACTIVATEOLDINST
  ShowWindow_(WindowID,#SW_RESTORE)
  SetForegroundWindow_(WindowID)
  EndIf
 ProcedureReturn Result
EndProcedure

hMutex = CreateMutex_(0, 0, @MutexName$)
If GetLastError_() = ERROR_ALREADY_EXISTS
  SendMessage_(#HWND_BROADCAST, WM_ACTIVATEOLDINST, 0, 0)
  End
EndIf


hwnd=OpenWindow(0,100,150,450,200,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget,"MyLittleTestApp ")
If hwnd
  SetWindowCallback(@MyWindowCallback())
  Repeat
   ev=WaitWindowEvent()
   If showoldwindow
   EndIf
  Until ev=#PB_EventCloseWindow
EndIf

If hMutex <> 0
 CloseHandle_(hMutex)
EndIf

End
I'll leave it up to you as a coding exercise to find out how to send a message to the old (first) app with a filepath. (like many editors do)
Shouldn't be hard, the messaging "example" is already here so. Hehe!
dibor
Enthusiast
Enthusiast
Posts: 125
Joined: Wed May 20, 2020 5:19 pm
Location: The 3rd planet in the Solar System
Contact:

Re: Exe instance question

Post by dibor »

Code: Select all

;--------Prevent app from being run more than once.---------------
*a = CreateSemaphore_(NULL,0,1,GetProgramName())
  If *a < > 0 And GetLastError_()= #ERROR_ALREADY_EXISTS
   CloseHandle_(*a)
   End
 EndIf
;---------------------------------------------------------
Mac Studio M1Max, PB 6.03Arm64 and x64.
Macbook Air M2, PB 6.03Arm64 and x64.
Windows 10, PB 6.03 x64 and x86.
Post Reply