C++ Windows进程控制

一、杀死指定进程

// 杀死指定进程
BOOL KillProcessFromName(CString strProcessName)
{
	HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	PROCESSENTRY32 pe;
	pe.dwSize = sizeof(PROCESSENTRY32);
	if (!Process32First(hSnapShot, &pe))
	{
		return FALSE;
	}
	strProcessName.MakeLower();
	while (Process32Next(hSnapShot, &pe))
	{
		CString scTmp = pe.szExeFile;
		scTmp.MakeLower();
		if (!scTmp.Compare(strProcessName))
		{
			DWORD dwProcessID = pe.th32ProcessID;
			HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessID);
			::TerminateProcess(hProcess, 0);
			CloseHandle(hProcess);
			return TRUE;
		}
		scTmp.ReleaseBuffer();
	}
	strProcessName.ReleaseBuffer();
	return FALSE;
}

二、判断指定进程是否存在

// 判断进程是否存在
BOOL IsProcessExit(const WCHAR* strFilename)
{ 
	BOOL bRet = FALSE;	
	HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);	
	if (hProcessSnap == INVALID_HANDLE_VALUE) 
		return FALSE;
	PROCESSENTRY32 pe32 = { 0 };	
	pe32.dwSize = sizeof(PROCESSENTRY32);	
	if (Process32First(hProcessSnap, &pe32)) 
	{ 
		do 
		{ 
			if (_wcsicmp(pe32.szExeFile, strFilename) == 0) 
			{ 
				bRet = TRUE;				
				break; 
			} 
		}
		while (Process32Next(hProcessSnap, &pe32)); 
	} 
	else 
	{ 
		bRet = FALSE; 
	}	
	CloseHandle(hProcessSnap);	
	return bRet; 
}

三、启动指定进程

// 启动进程
void  ProcessStart(CString strSrvName)
{
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	ZeroMemory(&si, sizeof(si));
	ZeroMemory(&pi, sizeof(pi));
	int num = 0;
	while (!CreateProcess(NULL, (LPWSTR)strSrvName.GetBuffer(), NULL, NULL, false, 0, NULL, NULL, &si, &pi))
	{
		num++;
		if (10 == num)
		{
			WriteLog("启动进程失败");
			break;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/hsq1596753614/article/details/82910416