Windowsコード集 上のページ

#0025 二重起動の防止(II)

#0001にも二重起動防止のテクニックが書かれておりますが、ウィンドゥを持たない場合もしくはもっと厳密にチェックを行いたい場合、ミューテックスオブジェクトという物を使う事でそれを実現する事ができます。
以下のクラスはオブジェクトをグローバル(←ここ必須!)に置く事で、二重起動防止のサポートを行えるようにします。

class CUnduplicationApp{
protected:
    HANDLE m_handle;
public:
    CUnduplicationApp():m_handle(NULL){;}
    ~CUnduplicationApp(){if(m_handle != NULL)CloseHandle(m_handle);}
    BOOL Regist(LPSTR exename){
        if(m_handle != NULL)CloseHandle(m_handle);
        m_handle = CreateMutex(NULL,FALSE,exename);
        if(WaitForSingleObject(m_handle,0) == WAIT_OBJECT_0)return TRUE;
        return FALSE;
    }
};


// 上記のクラスは、以下のようにグローバルにクラスを宣言します
CUnduplicationApp UndupApp;

// WinMain関数等の中で、以下のように二重起動を調べます
int WINAPI WinMain(HINSTANCE inst,HINSTANCE prev,LPSTR cmd,int show)
{
    if(!UndupApp.Regist("ABCDEFG.EXE")){    // "..." 内には起動するEXE名
        // 二重起動を検出したとき
        return 0;
    }

    //
    // ここからメインルーチンを書いていきます。
    //

    return 0;
}


上のページ