SOFTIST 编程方法筆記 →目录

防止应用程序重复起动(VC++)

Avoiding Multiple Application Instances

在一个应用程序正在执行时,由于各种理由,不想让这个程序被重复起动。在这种场合下,必须阻止程序的多次起动。防止应用程序重复起动的方法很多,这里记录用Mutex对象来防止应用程序重复起动的方法,是一个能够简单实现的方法。

1.生成Mutex对象。

调用 HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwner, LPCTSTR lpName); 生成Mutex对象。因为Mutex对象的名字是唯一的,一旦一个Mutex对象存活时,同名的Mutex对象不可能生成。作为名字的lpName参数可以是任何字符串。不过为了与别的应用程序的Mutex对象名字不巧合重复,何以用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.释放Mutex对象。

在使用MFCCWinApp派生类的場合,可以重载ExitInstance()函数,SDK的場合,可以在程序的最后, 释放掉Mutex对象。

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