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

  • デル株式会社
  • 古い記事。

     

    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();
        }
    }
    

    関連記事

    ページ上部へ戻る