Announcement

Collapse

New Sub-Forum

In an effort to help make sure there are appropriate categories for topics of discussion that are happening, there is now a sub-forum for databases and database programming under Special Interest groups. Please direct questions, etc., about this topic to that sub-forum moving forward. Thank you.
See more
See less

End if Previous Instance

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • End if Previous Instance

    VB6 has a very convenient way to end a new instance of an application if the application has an instance running.

    The VB code would be : If App.PrevInstance Then End

    I know this could be done with API calls but I am not sure what is the best way to accomplish it in the console and windows powerbasic programs. I think one method would be to detect the window of the running programs or an other way apparantly uses "mutex" API's - which I haven't really investigated enough to understand.

    Right now I need to "end" a couple of console powerbasic programs if they are launched when the programs are already running. If more than one instance of either of these programs runs it will completely corrupt a data base.

    Can anyone point me to the code I need? Or to an explanation of what I need to do to solve the multiple instances problem.

    Thanks

    Rudy Steury
    Rudy Steury

  • #2
    Code:
    Local hWnd As Dword
    
    hWnd= FindWindow(App_ClassName, ByVal %Null)
    If hWnd Then 
          If IsWindowVisible(hWnd)= 0 Then ShowWindow hWnd, %SW_SHOW
          SetForegroundWindow hWnd 
          'End Current Duplicate Instance
    Else
          'Continue with this instance
    End If
    sigpic
    Mobile Solutions
    Sys Analyst and Development

    Comment


    • #3
      There have got to be literally dozens of "previnstance" code snippets here.

      I'd use one which uses a mutex, not one of those which use "FindWindow" but that's probably just a 'panache points' thing....

      MCM
      Michael Mattias
      Tal Systems Inc. (retired)
      Racine WI USA
      [email protected]
      http://www.talsystems.com

      Comment


      • #4
        Rudy,

        Here's a Mutex example:
        Code:
        Function PBMain
         
             Mutex_Name$ = "Progam_To_Check_if_Running"
               ' GHL Added Mutex code from PB Forum by ???
                    'Check to see if program already running
                       Local hmutex&, smutex$ 'just used for testing program existence
                    smutex$ = Mutex_Name$   'Program name 
                    hmutex& = CreateMutex(ByVal %Null, 0, ByVal StrPtr(smutex$))'check if running
                    If hmutex& <> %Null Then 'Program probably already running
                       If GetLastError() = %error_already_exists Then 'Constant defined in WinAPI
                          MsgBox $CrLf & " is already running",, _
                                 SmuTex$
                         Exit Function
                      End If 
                    End If
        'Rest of code ...
        End Function
        === http://Www.SwedesDock.Com ===
        "Education is a progressive discovery
        of our own ignorance."
        Will Durant
        === http://Www.SwedesDock.Com ===
        It's a pretty day. I hope you enjoy it.

        Gösta

        JWAM: (Quit Smoking): http://www.SwedesDock.com/smoking
        LDN - A Miracle Drug: http://www.SwedesDock.com/LDN/

        Comment


        • #5
          Here's another version based on some code once posted by Semen which will bring the already running program to the fore..
          Code:
          'Function PBMain
          'Mutex check
          Dim WinName As Asciiz * %MAX_PATH
          Dim hMutex As Dword, hForWnd As Dword, hWin As Dword
           
          WinName = $AppTitle
          
          hMutex = CreateMutex(ByVal %NULL, 0, WinName)
            If hMutex = %NULL Then Exit Function
            If GetLastError = %ERROR_ALREADY_EXISTS Then    'already running!
              hWin = FindWindow (ByVal %Null, WinName)      'find handle of target window
              hForWnd = GetForegroundWindow                 'handle of current foreground window
                'Set own window to the top in Z-order with %HWND_TOP
                SetWindowpos hWin, %HWND_TOP, 0, 0, 0, 0, %SWP_NOMOVE Or %SWP_NOSIZE Or %SWP_SHOWWINDOW
                'Disable current foreground window.
                EnableWindow hForWnd, 0 
                'Redirect focus to next window in Z-order / move to foreground and activate
                SetForegroundWindow hWin                    
                'Re-enable previous foreground window
                EnableWindow hForWnd, 1
              Exit Function
            End If
          Rgds, Dave

          Comment

          Working...
          X