检查应用程序是否存在已在运行的实例

来源:互联网 发布:35互联域名转出 编辑:程序博客网 时间:2024/06/04 19:30

检查应用程序是否存在已经在运行的实例,如果有则强制终止之。

HANDLE GetPrevInstance(){HANDLE snapshot;PROCESSENTRY32 processInfo;processInfo.dwSize = sizeof(processInfo);snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (snapshot == NULL) return;bool flag = Process32First(snapshot, &processInfo);while(flag){if (!_tcsncmp(processInfo.szExeFile, CON_MAINEXE, _tcslen(CON_MAINEXE)) && processInfo.th32ProcessID != GetCurrentProcessId()){return OpenProcess(PROCESS_ALL_ACCESS, FALSE, processInfo.th32ProcessID);}flag = Process32Next(snapshot,&processInfo);}return NULL;CloseToolhelp32Snapshot(&snapshot);}BOOL SetPrivilege(HANDLEhToken, LPCTSTR lpszPrivilege, BOOL bEnablePrivilege){TOKEN_PRIVILEGES tp;LUID luid;int error = 0;if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid)){error = GetLastError();//::MessageBox(NULL, NULL, "\nLookupPrivilegeValue error:%d", GetLastError(), 0);return FALSE;}tp.PrivilegeCount = 1;tp.Privileges[0].Luid=luid;tp.Privileges[0].Attributes = bEnablePrivilege ? SE_PRIVILEGE_ENABLED : 0;AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL);if(GetLastError() != ERROR_SUCCESS){error = GetLastError();return FALSE;}returnTRUE;}void CheckPrevInstance(){HANDLE hProcess = NULL;DWORD count = 0;int error = 0;while ((hProcess = GetPrevInstance())){sleep(200);count ++;if (count >= 10){if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, &hProcessToken)){error = GetLastError();return;}if (!SetPrivilege(hProcessToken, SE_DEBUG_NAME, TRUE)){error = GetLastError();return;}    TerminateProcess(hProcess, 1);CloseHandle(hProcess);break;}CloseHandle(hProcess);}}