多重起動を防止する

アプリケーションが起動している間は新たに起動出来ないようにします。
方法は、起動時にミューテックスオブジェクトを作成し所有権を確保します。
起動中、同じアプリケーションを起動すると同じミューテックスオブジェクトが存在するので
GetLastError()ERROR_ALREADY_EXISTSを返します。
これを利用して起動しているか判断できます。

まずはミューテックスオブジェクトを保存するHANDLE型のメンバ変数を用意します。


private:
    HANDLE m_hMutex;
private:
    HANDLE m_hMutex;

次に起動時にミューテックスオブジェクトを作成するようにします。
InitInstance()の最初にCreateMutex()を使用して作成
CreateMutex()の3番目の引数にはそのアプリケーション独自の文字列を入れます。
アプリケーション名でも入れておくのが無難でしょう。

この後すぐに、GetlastError()で既に起動されているか調べます。
起動されていたならそのままミューテックスオブジェクトを開放し終了させます。


BOOL CXXXApp::InitInstance()
{
    m_hMutex = CreateMutex(FALSE, 0, _T("適当な文字列"));

    // 起動していたらすぐに終了させる
    if(::GetLastError() == ERROR_ALREADY_EXISTS)
    {
        CloseHandle(m_hMutex);
        return FALSE;  // FALSEを返すと終了する。
    }
      :
}

さて、これで多重起動の防止は出来たわけですが、これでは1つまずい事がおきます。
それはそのアプリケーションをを終了しても次に起動できません。
これは終了時にミューテックスオブジェクトの所有権を解放していない為、
OS内に残ったままになっているからです。
これを解決する為、終了時には解放してやらなければなりません。

解放場所はクラスウィザードでExitInstance()を追加し、そこで解放します。


int CXXXApp::ExitInstance() 
{
    // Mutexの所有権を解放する。
    ReleaseMutex(m_hMutex);
    CloseHandle(m_hMutex);

    return CWinApp::ExitInstance();
}

以上で多重起動の防止が出来ます。
他にも起動時にアプリケーションのウィンドウ名を検索し
同じウィンドウ名があれば終了するといった方法も有りますが
ウィンドウ名を持たないアプリケーションだと使う事が出来ません。
少し難しいですがこちらの方法のほうが全ての場合に対応できるので
覚えておいても損はないでしょう。

< 戻る << HOME ©1999-2001 by Akky, All right reserved.