检查应用程序是否存在已经在运行的实例,如果有则强制终止之。
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);
}
}