- 2012-2-15
- Visual C++
古い記事。
HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, // SD BOOL bInitialOwner, // initial owner LPCTSTR lpName // object name);
<説明> ミューテックスオブジェクトを作成する。
sMutexNameで指定したミューテックスオブジェクトが既に存在する場合、
このミューテックスオブジェクトをオープンし、
そのハンドルを返します。
関数の実行が成功すると、ミューテックスオブジェクトのハンドルが返される。
新規ミューテックスオブジェクトが作成された場合は、GetLastError()の戻り値は0となり、
既存のミューテックスオブジェクトがオープンされた場合は、
GetLastError()の戻り値はERROR_ALREADY_EXISTINGとなります。
名前のないミューテックスオブジェクトを作成することも可能である。
この場合、そのミューテックスオブジェクトへの参照は、
ハンドルによってのみ可能となる。
名前のないミューテックスオブジェクトは複数作成可能であり、
ハンドルによって識別されます。
取得したハンドルは、CloseHandleによって開放する。
オープンされているハンドルが全てクローズされると、
システムは自動的にミューテックスオブジェクトを削除します。
ミューテックスオブジェクトをオープンしているプロセスがクローズせずに終了した場合、
システムは自動的にプロセスがオープンしていたハンドルをクローズする。
しかし、スレッドがミューテックスオブジェクトのハンドルを
クローズせずに終了した場合、所有権が開放されるのみで、クローズされないままの状態となる。
この場合、待機関数はWAIT_ABNDONEDを返す。
fOwnerによって、作成と同時に呼び出し元スレッドが所有権を
取得するか否かを指定することができる。
<サンプル>
//ミューテック格納用 HANDLE m_hMutex;//クラスのメンバー変数
BOOL C*************::InitInstance()
{
//ミューテックスオブジェクトを作成 m_hMutex = ::CreateMutex(FALSE, 0, _T("APP"));
//二重起動確認 if(::GetLastError() == ERROR_ALREADY_EXISTS)//起動の確認 { ::CloseHandle(m_hMutex);//ハンドルのクローズ m_hMutex = NULL;//NULL格納 ExitInstanceメソッドでさらにクローズしないため return FALSE; } }
//ExitInstanceをオーバーライトしオブジェクトの開放とクローズを明示的に行う。 int C*************::ExitInstance() { // オブジェクトはNULL以外か? if (m_hMutex != NULL) { ::ReleaseMutex( m_hMutex );// ミューテックオブジェクト開放 ::CloseHandle( m_hMutex ); // ハンドルクローズ m_hMutex = NULL; return CWinApp::ExitInstance(); } }