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

提供:MochiuWiki : SUSE, EC, PCB
2021年11月16日 (火) 06:45時点におけるWiki (トーク | 投稿記録)による版 (文字列「<source lang」を「<syntaxhighlight lang」に置換)
ナビゲーションに移動 検索に移動

概要

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

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


サンプルコード

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

<syntaxhighlight lang="c++">
CWinAppの派生クラス.h

private:
   HANDLE m_hMutex;
</source>


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

<syntaxhighlight lang="c++">
CWinAppの派生クラス.cpp

BOOL CXXXApp::InitInstance()
{
   m_hMutex = CreateMutex(FALSE, 0, [アプリケーション名]);

   // 起動している場合は終了させる
   if(::GetLastError() == ERROR_ALREADY_EXISTS)
   {
      CloseHandle(m_hMutex);
      return FALSE;  // InitInstance関数はFALSEを返すと終了する
   }
   // (以下略)
}
</source>


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

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

<syntaxhighlight lang="c++">
CWinAppの派生クラス.cpp

int CXXXApp::ExitInstance() 
{
   // Mutexの所有権を解放
   ReleaseMutex(m_hMutex);
   CloseHandle(m_hMutex);
   return CWinApp::ExitInstance();
}
</source>


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