[kaze's test] プログラミングメモ →目次

アプリケーションの多重起動を防止する(VC++)

Avoiding Multiple Application Instances

アプリケーションが実行中に、色んな理由で、新たにそのアプリケーションを起動させたくない場合はあります。その場合は、多重起動を防止しなければなりません。多重起動を防止するに色んな方法がありますが、ミューテックスオブジェクトを使って、簡単に実現できます。


1.ミューテックスオブジェクトを作成します。HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName); を呼び出して、ミューテックスオブジェクトを作成します。ミューテックスオブジェクトの名前が唯一であるので、一つのミューテックスオブジェクトが生きている内に、同じ名前で二度と作成できないわけです。名前のlpName引数は適当な文字列で、他のミューテックスオブジェクトの名前と重複しなければ良いですが、GUID文字列作成ツールで世界中に唯一な名前を作ったほうが安心です。CreateMutex()は、アプリケーションの一番先頭で実装しなければいけません。MFCCWinAppの派生クラスを利用する場合は、BOOL InitInstance();をオーバーライドして、この関数の先頭部分でCreateMutex()を呼べば良いです。
HANDLE m_hMutex;
...
BOOL CTestApp::InitInstance()
{
    ...
    m_hMutex;= CreateMutex(NULL, TRUE, _T("XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"));
    if(GetLastError() == ERROR_ALREADY_EXISTS)
    {
        CloseHandlem_hMutex;
        CWnd* pWnd = CWnd::FindWindow(NULL, _T("TestApplication"));
        if (pWnd)
            pWnd->SetForegroundWindow();
        return FALSE;
    }
    ...
}

2.ミューテックスオブジェクトを開放します。CWinAppの派生クラスを利用する場合は、ExitInstance()関数で実装しますが、SDKの場合 は、プログラムの最後の場所に実装します。

int CTestApp::ExitInstance()
{
    ...
    if (m_hMutex != NULL)
    {
        ReleaseMutex(m_hMutex);
        CloseHandle(m_hMutex);
        m_hMutex = NULL;
    }
    ...
    return CWinApp::ExitInstance();
}