简介本文介绍C++中进程相关操作总结,主要有开启进程、结束进程以及判断进程是否存在,感兴趣的朋友可以参考一下。
开启进程
方式1 - CreateProcess
DWORD MyCreateProcess(CString strExePath, CString strCmdline, long& lProcessID)
{
DWORD re_vlaue = 0;
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartupInfo;
SECURITY_ATTRIBUTES saProcess, saThread;
ZeroMemory(&siStartupInfo, sizeof(siStartupInfo));
siStartupInfo.cb = sizeof(siStartupInfo);
siStartupInfo.dwFlags = STARTF_USESHOWWINDOW;
siStartupInfo.wShowWindow = SW_HIDE;
saProcess.nLength = sizeof(saProcess);
saProcess.lpSecurityDescriptor = NULL;
saProcess.bInheritHandle = true;
saThread.nLength = sizeof(saThread);
saThread.lpSecurityDescriptor = NULL;
saThread.bInheritHandle = true;
BOOL ret = ::CreateProcess((LPTSTR)strExePath.GetBuffer(), (LPTSTR)strCmdline.GetBuffer(), &saProcess, &saThread, false, CREATE_DEFAULT_ERROR_MODE, NULL, NULL, &siStartupInfo, &piProcInfo);
if (!ret)
{
return re_vlaue;
}
WaitForSingleObject(piProcInfo.hProcess, INFINITE);
lProcessID = piProcInfo.dwProcessId;
GetExitCodeProcess(piProcInfo.hProcess, &re_vlaue);
CloseHandle(piProcInfo.hProcess);
return re_vlaue;
}
// 开启进程
bool StartProcess(LPCTSTR program, LPCTSTR args)
{
bool bRet = false;
long lProcessID = 0;
int nRet = MyCreateProcess(program, args, lProcessID);
if (1 != nRet)
{
bRet = false;
}
else
{
bRet = true;
}
return bRet;
}
开启进程
方式2 - ShellExecuteEx
// 开启进程
// 使用MyCreateProcess调用会有问题 命令行参数不对 需要同一目录下调用
bool StartProcessByShell(LPCTSTR program, LPCTSTR args, bool bWait)
{
SHELLEXECUTEINFO ShExecInfo = { 0 };
ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO);
ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_FLAG_NO_UI;
ShExecInfo.hwnd = NULL;
ShExecInfo.lpVerb = _T("open");
ShExecInfo.lpFile = program;
ShExecInfo.lpParameters = args;
ShExecInfo.lpDirectory = NULL;
ShExecInfo.nShow = SW_SHOW;
ShExecInfo.hInstApp = NULL;
ShellExecuteEx(&ShExecInfo);
if (bWait)
{
WaitForSingleObject(ShExecInfo.hProcess, INFINITE);
}
return true;
}
结束进程
// 结束进程
BOOL KillProcessFromName(CString sProcessName)
{
if (sProcessName.IsEmpty())
{
return FALSE;
}
DWORD dwProcessID = GetProcessIDFromName(sProcessName);
if (dwProcessID == 0)
{
return FALSE;
}
HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessID);
::TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
return TRUE;
}
判断进程是否存在
// 判断进程是否存在
DWORD GetProcessIDFromName(CString sProcessName)
{
DWORD id = 0;
// 创建进程快照(TH32CS_SNAPPROCESS表示创建所有进程的快照)
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
// PROCESSENTRY32进程快照的结构体
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
if (!Process32First(hSnapShot, &pe))
{
return id;
}
// 将字符串转换为小写
sProcessName.MakeLower();
// 如果句柄有效 则一直获取下一个句柄循环下去
while (Process32Next(hSnapShot, &pe))
{
CString scTmp = pe.szExeFile;
scTmp.MakeLower();
// 比较当前进程的可执行文件名称和传递进来的文件名称是否相同,相同的话Compare返回0
if (!scTmp.Compare(sProcessName))
{
id = pe.th32ProcessID;
break;
}
}
return id;
}
本文向大家介绍一个C++实战项目:C++实现雪花算法(SnowFlake)产生唯一ID,主要涉及雪花算法、算法知识等,具有一定的C++实战价值,感兴趣的朋友可以参考一下。
本文介绍一个C++代码片段:如何在C++中删除一个文件目录下的所有文件及目录,感兴趣的朋友可以参考一下。
本文介绍C++实现C++实现8种排序算法,主要包括冒泡排序、插入排序、二分插入排序、希尔排序、直接选择排序、堆排序、归并排序、快速排序,直接上代码,感兴趣的朋友可以参考一下。
本文介绍C++实现线程同步的四种方式:事件对象、互斥对象、临界区、信号量,感兴趣的朋友可以参考一下。
本文介绍C++内存泄漏的检测与定位方法,感兴趣的朋友可以参考一下。
本文向大家介绍一个C++实战项目:C++实现一个多线程安全的队列容器模板类,主要涉及C++模板类的使用、互斥体实现多线程安全、队列数据结构等知识,具有一定的C++实战价值,感兴趣的朋友可以参考一下。