// 启动进程
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);
}
MFC关于进程使用:创建、关闭及查询进程
于 2022-03-01 13:38:49 首次发布