Windows下C++判断当前程序是否已存在活动实例

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhango5/article/details/61194228


直接贴代码吧,在main函数中调用即可:

头文件必不可少:

#include <windows.h> 
#include <tlhelp32.h>


实现函数:


bool isProcessExist()
{
    HANDLE hProcessSnap;
    PROCESSENTRY32 pe32;
    DWORD dwPid = 0;
    int nProcCount = 0;

    // 截取系统中运行进程的快照
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if (hProcessSnap == INVALID_HANDLE_VALUE)
    {
        return false;
    }

    pe32.dwSize = sizeof(PROCESSENTRY32);

    if (!Process32First(hProcessSnap, &pe32))
    {
        CloseHandle(hProcessSnap);          // clean the snapshot object
        return false;
    }

    // 获取自己程序的进程名,用于比对
    TCHAR szFileFullPath[_MAX_PATH] = {0};

    ::GetModuleFileName(NULL, static_cast<LPTSTR>(szFileFullPath), _MAX_PATH);

    int iLength = 0;
    char szFullPath[_MAX_PATH] = {0};
    //获取字节长度
    iLength = WideCharToMultiByte(CP_ACP, 0, szFileFullPath, -1, NULL, 0, NULL, NULL);
    //将tchar值赋给_char
    WideCharToMultiByte(CP_ACP, 0, szFileFullPath, -1, szFullPath, iLength, NULL, NULL);

    std::string strProcPath = szFullPath;
    // 得到自身进程名
    std::string szProcName = strProcPath.substr(strProcPath.find_last_of("\\") + 1);

    bool bRet = false;
    char szPeProcName[_MAX_PATH] = {0};
    do
    {
        // 遍历进程快照,比对是否有同名进程
        memset(szPeProcName, 0, _MAX_PATH);

        // wchar 转 char*
        sprintf(szPeProcName, "%ws", pe32.szExeFile );

        if (0 == strcmp(szProcName.c_str(), szPeProcName))
        {
            dwPid = pe32.th32ProcessID;

            ++nProcCount;
            if (nProcCount > 1)
            {
                // 不止有一个进程
                bRet = true;
                break;
            }
        }

    } while (Process32Next(hProcessSnap, &pe32));

    CloseHandle(hProcessSnap);

    return bRet;
}


当有且仅有一个同名进程时返回false,大于一个时返回true,后续操作看各位的了。

猜你喜欢

转载自blog.csdn.net/zhango5/article/details/61194228