PureBasic Forum https://www.purebasic.fr/english/ |
|
Exe instance question https://www.purebasic.fr/english/viewtopic.php?f=13&t=6097 |
Page 1 of 1 |
Author: | Cor [ Wed May 07, 2003 9:15 pm ] |
Post subject: | Exe instance question |
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? |
Author: | freak [ Wed May 07, 2003 9:34 pm ] |
Post subject: | |
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 |
Author: | Cor [ Wed May 07, 2003 9:37 pm ] |
Post subject: | |
Thanks Freak |
Author: | Berikco [ Wed May 07, 2003 9:44 pm ] |
Post subject: | |
Here an small example Code: 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 |
Author: | PB [ Thu May 08, 2003 2:06 am ] |
Post subject: | |
> Here an small example Here's an even smaller example: ![]() Code: ; 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 |
Author: | Berikco [ Thu May 08, 2003 7:56 am ] |
Post subject: | Re: Exe instance question |
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.... ![]() ![]() ![]() |
Author: | PB [ Thu May 08, 2003 9:49 am ] |
Post subject: | Re: Exe instance question |
> No PB, you did not read the whole question, to fast again. > First closed.....second.... ![]() |
Author: | Thade [ Sun Aug 03, 2003 3:59 am ] |
Post subject: | |
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? |
Author: | dagcrack [ Thu Mar 11, 2004 1:00 pm ] |
Post subject: | |
Hmm Dunno! maybe his proggy is a trial release and each time you open it you have less runs to go ? ![]() |
Author: | Rescator [ Thu Jun 16, 2005 12:48 am ] |
Post subject: | |
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: 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! |
Page 1 of 1 | All times are UTC + 1 hour |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |