tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 起動の排他処理
投稿日: 2008/06/19(Thu) 22:07
投稿者むーしゃん
はじめまして、むーしゃんと申します。

2つのアプリケーションが排他起動するように下の関数を作ったのですが・・・

例えば、
アプリAで「CreateMutex(ByVal 0&, 0&, "AAA")」Mutexオブジェクトを作り起動します。
その後に、別アプリBで「CheckMutexEntiry("AAA")」とアプリAが起動していないか確認します。
そのとき、WaitForSingleObjectの戻り値が
「WAIT_ABANDONED」か「WAIT_OBJECT_0」のどちらかになります。
(期待する値は『WAIT_OBJECT_0』のほうなのですが。)
なぜ戻り値が実行するたびに変わってしまうのでしょうか?

=================================================================
WAIT_OBJECT_0 = &H0
WAIT_ABANDONED = &H80
NG = -1
OK = 0
=================================================================
'//--------------------------------------------------------//
'// 関数名  CheckMutexEntiry
'// 用途    Mutexの登録状況の確認
'// 引数    String  [ChkName : 確認名]
'// 戻り値  Integer [OK:起動OK / NG:アプリ起動中]
'//--------------------------------------------------------//
Private Function CheckMutexEntiry(ChkName As String)
    Dim ret     As Integer
    Dim hMutex  As Long
    
    CheckMutexEntiry = NG
    
    ' ミューテックスオブジェクトがオープンできるか確認
    hMutex = OpenMutex(MUTEX_ALL_ACCESS, False, ChkName)
    
    If hMutex <> 0 Then
        'WaitForSingleObjectにて状態判断
        ret = WaitForSingleObject(hMutex, 0)

        Select Case ret
            ' 解放されていないオブジェクト
            Case WAIT_ABANDONED:
                'そのハンドルを開放してあげる
                Call ReleaseMutex(hMutex)
                Call CloseHandle(hMutex)

            ' その他
            Case Else:
                Exit Function
        End Select
    End If
    
    CheckMutexEntiry = OK
End Function
=================================================================

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。