二重起動防止に役立つかも

  • デル株式会社
  • 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();
          }
      }

    関連記事

    ページ上部へ戻る