2009-06-11 10 views
1

Ich versuche zu überprüfen, ob eine andere Instanz der Anwendung bereits ausgeführt wird. Ist dies der Fall, ich will für weitere 15 Sekunden lang auf die Überprüfung zu halten oder so, bevor sie auf ...App.PrevInstance nicht selbst aktualisieren

if App.PrevInstance then 

    dim dtStart as date 
    dtStart = now 

    do while datediff("s", dtStart, Now) < 15 
    Sleep 1000 ' sleep for a second 
    if not App.PrevInstance then exit do 
    loop 

end if 

Das Problem ist App.PrevInstance nicht selbst zu aktualisieren scheint. es behält den Anfangswert, egal was passiert.

Gibt es eine andere Möglichkeit, dies zu erreichen? Vielleicht mit API-Calls. Beachten Sie, dass die Anwendung möglicherweise ein Fenster hat oder nicht, daher kann ich nicht nach einem Vorhandensein eines Fensters mit einer bestimmten Beschriftung suchen.

+0

Welcher Teil von "vorheriger" war unklar? (-: –

Antwort

0

Ich verwende die folgende Klasse:

 
'--------------------------------------------------------------------------------------- ' Module : CApplicationSingleton ' DateTime : 24/03/2006 15:16 ' Author : Fernando ' Purpose : Enforces a single instance of an application. Uses a Mutex '    see http://www.codeguru.com/forum/showthread.php?s=&threadid=293730 '    http://www.codeguru.com/Cpp/W-P/system/processesmodules/article.php/c5745/ ' Copyright © 2001-2007 AGBO Business Architecture S.L. '--------------------------------------------------------------------------------------- 

Option Explicit 

Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long 

Private Type SECURITY_ATTRIBUTES 
    nLength As Long 
    lpSecurityDescriptor As Long 
    bInheritHandle As Long 
End Type 

Private Const ERROR_ALREADY_EXISTS = 183& 

Private m_hMutex As Long Private m_lLastDllError As Long 

Private Sub Class_Initialize() ' 

On Error GoTo errorBlock 

' 

Dim s As SECURITY_ATTRIBUTES 
m_hMutex = CreateMutex(s, 0, rcString(8700)) m_lLastDllError = Err.LastDllError 


' 


exitBlock: 
    Exit Sub 
    errorBlock: 

    Call GError.handleError(Err.Number, Err.Description, Erl, "CApplicationSingleton", "Class_Initialize", GApp.copyDebugFiles()) 
    Resume exitBlock 


' End Sub 

Private Sub Class_Terminate() On Error GoTo errorBlock 


If m_hMutex > 0 Then 
    Call CloseHandle(m_hMutex) End If 


exitBlock: 
    Exit Sub 
    errorBlock: 

    Call GError.handleError(Err.Number, Err.Description, Erl, "CApplicationSingleton.cls", "Class_Terminate") 
    Resume exitBlock 




End Sub 


Public Function IsAnotherInstanceRunning() As Boolean ' 

On Error GoTo errorBlock 

' 

IsAnotherInstanceRunning = (m_lLastDllError = ERROR_ALREADY_EXISTS) 

' 


exitBlock: 
    Exit Function 
    errorBlock: 

    Call GError.handleError(Err.Number, Err.Description, Erl, "CApplicationSingleton", "IsAnotherInstanceRunning", GApp.copyDebugFiles()) 
    Resume exitBlock 


' End Function 
2

Vielleicht möchten Sie dies einen Blick geben: http://www.codeguru.com/forum/showthread.php?t=293730

+0

+1, wir verwenden Mutexe anstelle von App.Previnstance, sie funktionieren gut. Ich habe den Mutex-API-Code in diesem Link nicht wirklich untersucht, um sicherzustellen, dass er korrekt ist, aber er sieht in der richtigen Richtung aus. – MarkJ

0

Ich benutzte die Mutex-Klasse das gleiche Problem zu arbeiten, mehrere Male die gleichen App mit starten. Es schien zu funktionieren, hörte dann auf zu arbeiten und gab ein falsches positives Ergebnis zurück. Was ich fand, ist, dass die vb6 IDE auch einen Mutex hielt, während die IDE noch offen war.

Sie müssen den Code verwenden und kompilieren. Die EXE funktioniert gut, nachdem Sie die IDE geschlossen haben. Wer wusste? Fuhr mich verrückt (ier) für ein paar Minuten ..

Ich werde eine Probe veröffentlichen, wenn jemand es will.