tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル起動の排他処理
記事No12595
投稿日: 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
=================================================================

[ツリー表示へ]
タイトルRe: 起動の排他処理
記事No12598
投稿日: 2008/06/21(Sat) 06:59
投稿者花ちゃん
回答ではありません。
レスがないようでしたら、どなたでも投稿されたコードをコピペしたら事象が
再現できるようなコードを投稿して見てください。

現在の投稿内容だけで答えられるような(答えようとする)方は少ないかと。
(おそらく事前にWEB上を検索して調べておられるでしょうし)

[ツリー表示へ]
タイトルRe: 起動の排他処理
記事No12603
投稿日: 2008/06/21(Sat) 12:56
投稿者K.J.K.
> (期待する値は『WAIT_OBJECT_0』のほうなのですが。)

それはおかしいのでは。
Mutexが存在し、且つ他者によってかつては占有され、解放処理がなされていない
状況では、期待される値はWAIT_ABANDONED_0ですよね。

> なぜ戻り値が実行するたびに変わってしまうのでしょうか?

そのMutexをきちんと解放していますか? 最初にCreateMutexを呼び出し
占有するアプリがReleaseMutexを終了時及び待機時に毎回呼び出していますか?

[ツリー表示へ]
タイトルRe^2: 起動の排他処理
記事No12609
投稿日: 2008/06/22(Sun) 20:03
投稿者むーしゃん
レス、ありがとございます。

> > (期待する値は『WAIT_OBJECT_0』のほうなのですが。)
> それはおかしいのでは。
> Mutexが存在し、且つ他者によってかつては占有され、解放処理がなされていない
> 状況では、期待される値はWAIT_ABANDONED_0ですよね。
はい、その通りです。
なのに、「WAIT_ABANDONED」が発生する理由がわからないのです。

> > なぜ戻り値が実行するたびに変わってしまうのでしょうか?
> そのMutexをきちんと解放していますか? 最初にCreateMutexを呼び出し
> 占有するアプリがReleaseMutexを終了時及び待機時に毎回呼び出していますか?
アプリ終了時にReleaseMutexを呼び出しています。

[ツリー表示へ]
タイトルRe: 起動の排他処理
記事No12610
投稿日: 2008/06/22(Sun) 20:43
投稿者K.J.K.
> > 占有するアプリがReleaseMutexを終了時及び待機時に毎回呼び出していますか?
> アプリ終了時にReleaseMutexを呼び出しています。

WaitForSingleObject などの待機関数の呼び出した後にも呼んでいますか?

[ツリー表示へ]