2009-06-11 11 views
1

アプリケーションの別のインスタンスが既に実行されているかどうかを確認しようとしています。それがない場合は、私が上に行く前に別の15秒程度のチェックに維持したい...App.PrevInstance自体がリフレッシュされない

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 

問題はApp.PrevInstanceが自分自身をリフレッシュしていないようです。それは何があっても初期値を保持します。

これに別の方法がありますか?おそらくAPI呼び出しで。アプリケーションにはウィンドウがある場合とない場合があるので、特定のキャプションがあるウィンドウが存在するかどうかを確認することはできません。

+0

"以前の"どの部分が不明でしたか? ( - : –

答えて

0

私は以下のクラスを使用します。

 
'--------------------------------------------------------------------------------------- ' 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

あなたはこれに表情を与えたいと思うかもしれません:http://www.codeguru.com/forum/showthread.php?t=293730

+0

+1、私たちはApp.Previnstanceの代わりにmutexを使用していますが、うまくいきます。正しいリンクが正しいことを確認するためにmutex APIコードを実際に見ているわけではありません。 – MarkJ

0

私は同じアプリを複数回起動すると、同じ問題をうまくするためにミューテックスのクラスを使用していました。それは働いているように見えて、偽陽性を返す作業をやめた。私が見つけたのは、IDEがまだ開いている間にvb6 IDEもミューテックスを保持していたことです。

コードを使用してコンパイルする必要があります。あなたがIDEを閉じた後、EXEは正常に動作します。誰が知っていましたか?私を数分間夢中にしてください。

誰かが望むなら、私はサンプルを投稿します。

関連する問題