二重起動の禁止(U)             <TOP>


二つのアプリケーションのファイル名が、異なっていても、二重起動を禁止します。

OpenMutex 既存の名前付きミューテックスオブジェクトを開く
CreateMutex 名前付きまたは名前なしのミューテックスオブジェクトを作成または開く
ReleaseMutex 指定されたミューテックスオブジェクトの所有権を解放
CloseHandle オープンされているオブジェクトハンドルをクローズ
 

「Test Mutex」という名前のミューテックスが、あるかどうかを確認し、無ければ「Test Mutex」を作成して起動します。有る場合は、その旨メッセージを表示させ終了します。

初回起動時

もう1個起動した場合

参照

二重起動の禁止(T)

 
'================================================================
'= 二重起動の防止
'=    (CreateMutex.bas)
'================================================================
#include "Windows.bi"

' 既存の名前付きミューテックスオブジェクトを開く
Declare Function Api_OpenMutex& Lib "kernel32" Alias "OpenMutexA" (ByVal dwDesiredAccess&, ByVal bInheritHandle&, ByVal lpName$)

' 名前付きまたは名前なしのミューテックスオブジェクトを作成または開く
Declare Function Api_CreateMutex& Lib "kernel32" Alias "CreateMutexA" (ByRef lpMutexAttributes As Any, ByVal bInitialOwner&, ByVal lpName$)

' 指定されたミューテックスオブジェクトの所有権を解放
Declare Function Api_ReleaseMutex& Lib "kernel32" Alias "ReleaseMutex" (ByVal hMutex&)

' オープンされているオブジェクトハンドルをクローズ
Declare Function Api_CloseHandle& Lib "Kernel32" Alias "CloseHandle" (ByVal hObject&)

#define ERROR_ALREADY_EXISTS 183        '既に存在している
#define MUTEX_ALL_ACCESS &H1F0001       '

Var Shared Mutex As Long

'================================================================
'=
'================================================================
Declare Sub MainForm_Start edecl ()
Sub MainForm_Start()
    Var Ret As Long

    'ミューテックスオブジェクトを開く
    Mutex = Api_OpenMutex(MUTEX_ALL_ACCESS, 0, "Test Mutex")

    If Mutex = 0 Then
        'ミューテックスオブジェクトを作成または開く
        Mutex = Api_CreateMutex(ByVal 0, 0, "Test Mutex")

        A% = MessageBox(GetWindowText, "起動しました!", 0, 2)
    Else
        'オブジェクトハンドルをクローズ
        Ret = Api_CloseHandle(Mutex)

        A% = MessageBox(GetWindowText, "既に起動しています!", 0, 2)

        'ミューテックスオブジェクトの所有権を解放
        Ret = Api_ReleaseMutex(Mutex)
        End
    End If
End Sub

'================================================================
'=
'================================================================
Declare Sub MainForm_QueryClose edecl ()
Sub MainForm_QueryClose()
    Var Ret As Long

    'ミューテックスオブジェクトの所有権を解放
    Ret = Api_ReleaseMutex(Mutex)
End Sub

'================================================================
'=
'================================================================
While 1
    WaitEvent
Wend
Stop
End