📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
細 Wiki がページ「二重起動を禁止する(MFC)」を「MFCの基礎 - 2重起動の禁止」に、リダイレクトを残さずに移動しました |
細 文字列「</source>」を「</syntaxhighlight>」に置換 |
||
| (同じ利用者による、間の1版が非表示) | |||
| 9行目: | 9行目: | ||
== サンプルコード == | == サンプルコード == | ||
まず、CWinAppの派生クラスのヘッダファイルにミューテックスオブジェクトを保存するHANDLE型のメンバ変数を用意する。<br> | まず、CWinAppの派生クラスのヘッダファイルにミューテックスオブジェクトを保存するHANDLE型のメンバ変数を用意する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
CWinAppの派生クラス.h | CWinAppの派生クラス.h | ||
private: | private: | ||
HANDLE m_hMutex; | HANDLE m_hMutex; | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
次に、起動時にミューテックスオブジェクトを作成する。<br> | 次に、起動時にミューテックスオブジェクトを作成する。<br> | ||
InitInstance関数の最初にCreateMutex関数を使用して作成し、CreateMutex関数の3番目の引数にそのアプリケーション固有の文字列(アプリケーション名でよい)を渡す。<br> | InitInstance関数の最初にCreateMutex関数を使用して作成し、CreateMutex関数の3番目の引数にそのアプリケーション固有の文字列(アプリケーション名でよい)を渡す。<br> | ||
その直後に、GetlastError関数で既に起動しているか調べる。起動している場合、そのままミューテックスオブジェクトを開放し終了させる。<br> | その直後に、GetlastError関数で既に起動しているか調べる。起動している場合、そのままミューテックスオブジェクトを開放し終了させる。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
CWinAppの派生クラス.cpp | CWinAppの派生クラス.cpp | ||
| 34行目: | 34行目: | ||
// (以下略) | // (以下略) | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
上記だけでは、アプリケーション終了時にミューテックスオブジェクトの所有権を解放していないため、次の起動ができない。<br> | 上記だけでは、アプリケーション終了時にミューテックスオブジェクトの所有権を解放していないため、次の起動ができない。<br> | ||
| 40行目: | 40行目: | ||
<br> | <br> | ||
解放を記述する場所は、クラスウィザードでExitInstance関数を追加し、そこで解放する。<br> | 解放を記述する場所は、クラスウィザードでExitInstance関数を追加し、そこで解放する。<br> | ||
< | <syntaxhighlight lang="c++"> | ||
CWinAppの派生クラス.cpp | CWinAppの派生クラス.cpp | ||
| 51行目: | 51行目: | ||
return CWinApp::ExitInstance(); | return CWinApp::ExitInstance(); | ||
} | } | ||
</ | </syntaxhighlight> | ||
<br> | <br> | ||
以上で二重起動の禁止ができる。<br> | 以上で二重起動の禁止ができる。<br> | ||