2010年1月18日月曜日

[WIN]Visual C++ MFCで多重起動を防ぐ

定番の処理ですが、備忘録として...
手法としてはミューテックスを使用し、派生したアプリケーションクラスのコンストラクタでミューテックスを定義、デストラクタで開放、InitInstance()内でロックされているかをチェックします。


// アプリケーションクラスヘッダのメンバ定義
    CMutex* m_mutexMultiExec; // 多重起動防止用ミューテックス
    CSingleLock* m_lockMultiExec;

//コンストラクタ
CMyApp::CMyApp()
{
    // 多重起動を防ぐ為のミューテックスの定義
    m_mutexMultiExec = new CMutex(FALSE, "MyAppMutex");
    m_lockMultiExec = new CSingleLock(m_mutexMultiExec);
}

// デストラクタ
CMyApp::~CMyApp()
{
    // 多重起動防止ミューテックスの解放
    if(m_lockMultiExec -> IsLocked())
        m_lockMultiExec -> Unlock();
    
    delete m_lockMultiExec;
    delete m_mutexMultiExec;
}

// インスタンスの初期化処理
BOOL CMyApp::InitInstance()
{
    // すでに別のインスタンスが起動している場合には終了する
if(!m_lockMultiExec -> Lock(IGNORE)) return FALSE; // ...そのほかの初期化処理 }

【注意事項】ここに掲載されている内容について引用流用は自由ですが、内容やサンプルに基づくいかなる結果に関して一切の責任を負いません。自己の責任の上でご活用ください。