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

    xiaoxiao2021-03-25  104

    直接贴代码吧,在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,后续操作看各位的了。

    转载请注明原文地址: https://ju.6miu.com/read-19590.html

    最新回复(0)