「MFCの基礎 - 2重起動の禁止」の版間の差分
ナビゲーションに移動
検索に移動
細 (Wiki がページ「二重起動を禁止する(MFC)」を「MFCの基礎 - 2重起動の禁止」に、リダイレクトを残さずに移動しました) |
細 (文字列「<source lang」を「<syntaxhighlight lang」に置換) |
||
9行目: | 9行目: | ||
== サンプルコード == | == サンプルコード == | ||
まず、CWinAppの派生クラスのヘッダファイルにミューテックスオブジェクトを保存するHANDLE型のメンバ変数を用意する。<br> | まず、CWinAppの派生クラスのヘッダファイルにミューテックスオブジェクトを保存するHANDLE型のメンバ変数を用意する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
CWinAppの派生クラス.h | CWinAppの派生クラス.h | ||
19行目: | 19行目: | ||
InitInstance関数の最初にCreateMutex関数を使用して作成し、CreateMutex関数の3番目の引数にそのアプリケーション固有の文字列(アプリケーション名でよい)を渡す。<br> | InitInstance関数の最初にCreateMutex関数を使用して作成し、CreateMutex関数の3番目の引数にそのアプリケーション固有の文字列(アプリケーション名でよい)を渡す。<br> | ||
その直後に、GetlastError関数で既に起動しているか調べる。起動している場合、そのままミューテックスオブジェクトを開放し終了させる。<br> | その直後に、GetlastError関数で既に起動しているか調べる。起動している場合、そのままミューテックスオブジェクトを開放し終了させる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
CWinAppの派生クラス.cpp | CWinAppの派生クラス.cpp | ||
40行目: | 40行目: | ||
<br> | <br> | ||
解放を記述する場所は、クラスウィザードでExitInstance関数を追加し、そこで解放する。<br> | 解放を記述する場所は、クラスウィザードでExitInstance関数を追加し、そこで解放する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
CWinAppの派生クラス.cpp | CWinAppの派生クラス.cpp | ||
2021年11月16日 (火) 06:45時点における版
概要
アプリケーションが起動している間は新たに起動出来ないようにする方法を記載する。
方法は、起動時にミューテックスオブジェクトを作成し所有権を確保する。
起動中に同じアプリケーションを起動すると同じミューテックスオブジェクトが存在するので、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>
以上で二重起動の禁止ができる。