「MFCの基礎 - 2重起動の禁止」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
(文字列「<source lang」を「<syntaxhighlight lang」に置換)
(文字列「</source>」を「</syntaxhighlight>」に置換)
 
14行目: 14行目:
  private:
  private:
     HANDLE m_hMutex;
     HANDLE m_hMutex;
  </source>
  </syntaxhighlight>
<br>
<br>
次に、起動時にミューテックスオブジェクトを作成する。<br>
次に、起動時にミューテックスオブジェクトを作成する。<br>
34行目: 34行目:
     // (以下略)
     // (以下略)
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
上記だけでは、アプリケーション終了時にミューテックスオブジェクトの所有権を解放していないため、次の起動ができない。<br>
上記だけでは、アプリケーション終了時にミューテックスオブジェクトの所有権を解放していないため、次の起動ができない。<br>
51行目: 51行目:
     return CWinApp::ExitInstance();
     return CWinApp::ExitInstance();
  }
  }
  </source>
  </syntaxhighlight>
<br>
<br>
以上で二重起動の禁止ができる。<br>
以上で二重起動の禁止ができる。<br>

2021年11月24日 (水) 18:08時点における最新版

概要

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

方法は、起動時にミューテックスオブジェクトを作成し所有権を確保する。
起動中に同じアプリケーションを起動すると同じミューテックスオブジェクトが存在するので、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();
 }


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