note : 检测并激活已经运行的实例

来源:互联网 发布:matlab软件下载lvsexz 编辑:程序博客网 时间:2024/05/17 01:27

年前参加一个外包项目时, 也需要用到检测并激活已经运行的实例。

由于项目经理不是搞C的, 杂七杂八的事也挺多,从来没人看代码. 当时花了半小时,搞了一个特土鳖的方法实现。

也只能这样,  大家都在看结果. 不用土鳖的方法,用啥呢?

用INI文件的键值作为交互,新实例运行后,发现旧实例存在,向INI中写入标识,请激活~, 然后新实例退出.

旧实例开了一个线程,每隔一秒检测一下INI, 如果看到"请激活的标记", 显示到前台(假设是最小化或隐藏的情况), 然后清掉"请激活"标记.


今天我负责的项目被要求加上这个小功能,这次搞了一个 event  + 线程检测的方法,看着文明多了~


程序入口检测和建立互斥量和事件.

int Entry_tWinMain(HINSTANCE hInstance,    HINSTANCE hPrevInstance,    LPTSTR    lpCmdLine,    int       nCmdShow){    std::wstringstrSkinResourcePath;    CMainDlg * pMainDlg = NULL;    if (ns_base::IsAlreadyRunOnce(PE_INSTANCE_NAME_MAIN_PROG, g_hInstanceMutex))    {        if (ns_base::fnOpenEvent(EVENT_NAME_INSTANCE_ACTIVE, g_hEventActive))        {            ::SetEvent(g_hEventActive);        }        return 0;    }    ns_base::fnCreateEvent(EVENT_NAME_INSTANCE_ACTIVE, g_hEventActive);///... 

后台线程检测

    /// 一般性后台任务    while (!IsNeedQuitThreadBgTask())    {        ::Sleep(1000);        if (ns_base::IsMutextExist(PE_INSTANCE_NAME_CMD_LET_MAIN_PROG_QUIT))        {            this->PostMessageW(WM_CLOSE, 0, 0);            break;        }        if (WAIT_OBJECT_0 == ::WaitForSingleObject(g_hEventActive, 0))        {            ::ResetEvent(g_hEventActive);            ShowWindow();        }/// ... 

工具函数

    BOOL MutextRunOnce(const WCHAR * pcMutexName, HANDLE & hMutex)    {        hMutex = ::CreateMutexW(NULL, TRUE, pcMutexName);        if (ERROR_ALREADY_EXISTS == GetLastError())        {            return FALSE;        }        return TRUE;    }    BOOL IsAlreadyRunOnce(const WCHAR * pcMutexName, HANDLE & hMutex)    {        hMutex = ::CreateMutexW(NULL, TRUE, pcMutexName);        if (ERROR_ALREADY_EXISTS == GetLastError())        {            SAFE_CLOSE_HANDLE(hMutex);            return TRUE;        }        return FALSE;    }    BOOL IsMutextExist(const WCHAR * pcMutexName)    {        BOOL bRc = FALSE;        HANDLE hMutex = INVALID_HANDLE_VALUE;        if (NULL == pcMutexName)            return FALSE;        bRc = IsAlreadyRunOnce(pcMutexName, hMutex);        SAFE_CLOSE_HANDLE(hMutex);        return bRc;    }    BOOL fnCreateEvent(const WCHAR * pcEventName, HANDLE & hEvent)    {        hEvent = ::CreateEventW(NULL, TRUE, FALSE, pcEventName);        if (NULL == hEvent)            return FALSE;        return (ERROR_ALREADY_EXISTS == GetLastError()) ? FALSE : TRUE;    }    BOOL fnOpenEvent(const WCHAR * pcEventName, HANDLE & hEvent)    {        hEvent = ::OpenEventW(EVENT_ALL_ACCESS , FALSE, pcEventName);        return (NULL != hEvent);    }




0 0
原创粉丝点击