タイトル | : 起動の排他処理 |
記事No | : 12595 |
投稿日 | : 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 =================================================================
|