MFCの基礎 - 2重起動の禁止

2019年10月25日 (金) 16:18時点における192.168.1.24による版

概要

アプリケーションが起動している間は新たに起動出来ないようにする方法を記載する。

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


サンプルコード

まず、CWinAppの派生クラスのヘッダファイルにミューテックスオブジェクトを保存するHANDLE型のメンバ変数を用意する。

 '''CWinAppの派生クラス.h'''
 
 private:
    HANDLE m_hMutex;


次に、起動時にミューテックスオブジェクトを作成する。
InitInstance関数の最初にCreateMutex関数を使用して作成し、CreateMutex関数の3番目の引数にそのアプリケーション固有の文字列(アプリケーション名でよい)を渡す。
その直後に、GetlastError関数で既に起動しているか調べる。起動している場合、そのままミューテックスオブジェクトを開放し終了させる。

 '''CWinAppの派生クラス.cpp'''
 
 BOOL CXXXApp::InitInstance()
 {
    m_hMutex = CreateMutex(FALSE, 0, [アプリケーション名]);
 
    // 起動している場合は終了させる
    if(::GetLastError() == ERROR_ALREADY_EXISTS)
    {
       CloseHandle(m_hMutex);
       return FALSE;  // InitInstance関数はFALSEを返すと終了する
    }
    // (以下略)
 }


上記だけでは、アプリケーション終了時にミューテックスオブジェクトの所有権を解放していないため、次の起動ができない。
そのため、アプリケーション終了時にミューテックスオブジェクトを解放しなければならない。

解放を記述する場所は、クラスウィザードでExitInstance関数を追加し、そこで解放する。

 '''CWinAppの派生クラス.cpp'''
 
 int CXXXApp::ExitInstance() 
 {
    // Mutexの所有権を解放
    ReleaseMutex(m_hMutex);
    CloseHandle(m_hMutex);

    return CWinApp::ExitInstance();
 }


以上で二重起動の禁止ができる。