MFC关于进程使用:创建、关闭及查询进程

// 启动进程
bool StartProgress(CString& strError)
{
	CString strExeName;
	strExeName.Format(_T("%s"), _T("test.exe"));

	CString strsCommandLine;  
	char chCommandLine[MAX_PATH];  
	DWORD dwExitCode;  
	PROCESS_INFORMATION pi;  

	STARTUPINFO     si;//用于指定新进程的主窗口特性的一个结构  
	memset(&si, 0, sizeof(si));  
	si.cb = sizeof(STARTUPINFO);  
	si.dwFlags = STARTF_USESHOWWINDOW;  
	si.wShowWindow = SW_SHOW;//SW_HIDE隐藏窗口  

	csCommandLine = strExeName;  
	::strcpy(chCommandLine, csCommandLine);  

	CString strPath;
	strPath.Format(_T("%s\\"), GetAppPath());

	//启动进程  
	BOOL ret = CreateProcess(NULL, chCommandLine, NULL, NULL, FALSE, 0, NULL, strPath, &si, &pi);  
	if (ret)  
	{  
		//关闭子进程的主线程句柄  
		CloseHandle(pi.hThread);    

		//关闭子进程句柄  
		CloseHandle(pi.hProcess);

		return true;
	}
	else
	{
		DWORD dwErr = ::GetLastError();
		CString sInfo;
		sInfo.Format(_T("启动 %s 失败, 错误码: 0x%X"), csCommandLine, dwErr);

		strError = sInfo;
	}

	return false;
}
// 查询进程
bool IsExistProcess(const CString& szProcessName)
{
	PROCESSENTRY32 processEntry32;   
	HANDLE toolHelp32Snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,  0);  
	if (((int)toolHelp32Snapshot) != -1)  
	{  
		processEntry32.dwSize = sizeof(processEntry32);  
		if (Process32First(toolHelp32Snapshot, &processEntry32))  
		{  
			do  
			{  
				if(strcmp(szProcessName ,processEntry32.szExeFile) == 0)  
				{  
					CloseHandle(toolHelp32Snapshot);  

					return true;  
				}  
			}while (Process32Next(toolHelp32Snapshot, &processEntry32));  
		}  
		CloseHandle(toolHelp32Snapshot);  
	}  

	return false;
}

// 强制关闭进程
bool KillProcessByName(const TCHAR *lpszProcessName)
{
	unsigned int   pid = -1;  
	BOOL    retval = TRUE;  

	if (lpszProcessName == NULL)  
		return false;  

	DWORD dwRet = 0;  
	HANDLE hSnapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS,0 );  
	PROCESSENTRY32 processInfo;  
	processInfo.dwSize = sizeof( PROCESSENTRY32 );  
	int flag = Process32First( hSnapshot, &processInfo );  

	// Find the process with name as same as lpszProcessName  
	while (flag != 0)  
	{  
		if (_tcscmp(processInfo.szExeFile, lpszProcessName) == 0) {  
			// Terminate the process.  
			pid = processInfo.th32ProcessID;  
			HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid);  

			if (TerminateProcess(hProcess, 0) != TRUE)
			 { 
			 	// Failed to terminate it.  
				retval = FALSE;  
				break;  
			}  
		}  

		flag = Process32Next(hSnapshot, &processInfo);   
	} // while (flag != 0)  

	CloseHandle(hSnapshot);  

	if (pid == -1)  
		return FALSE;  

	return (retval != FALSE);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欧特克_Glodon

很高兴能帮助到您!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值