a)进程创建
本例主要使用CreateProcess函数,语法格式如下:
BOOL CreateProcess(
LPCTSRT lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ARRRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnvironment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPPROCESS_INFORMATION lpProcessInformation
);
参数说明:
lpApplicationName : 表示启动的应用程序名称,如果为NULL,则函数采用lpCommandLine参数提供的应用程序名称
lpCommandLine :表示传递给应用程序的命令行参数
lpProcessAttributes:表示创建的进程的安全属性,如果为NULL,则采用当前进程的安全属性
lpThreadAttributes :表示线程的安全属性
bInheritHandles :表示进程句柄能够被继承
dwCreationFlags :表示创建标记,通常为CREATE_NEW_CONSOLE,表示告诉系统为新进程创建一个新的控制台窗口
lpEnvironment :表示新进程使用的环境字符串的内容块
lpCurrentDirectory :设置子进程的当前驱动器目录
lpStartupInfo :表示为子进程提供的开始信息。用户通常只需要定义一个STARTUPINFO结构对象,并设置对象的cb成员为结构大小即可
lpProcessInformation:用于记录子进程的进程句柄,线程句柄,进程ID等信息
设计过程:
设计一个点击按钮打开画图板程序。
主要代码如下:
void CMy4_1Process_ThreadDlg::OnBnClickedOpenmspaint()
{
STARTUPINFO si; //定义STARTUPINFO结构
memset(&si, 0, sizeof(STARTUPINFO));
si.cb = sizeof(STARTUPINFO);//设定大小
PROCESS_INFORMATION pi;
memset(&pi, 0, sizeof(PROCESS_INFORMATION)); //定义PROCESS_INFOMATION
//打开进程
BOOL res = CreateProcess(NULL, _T("mspaint.exe"), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
if (!res)
{
MessageBox(_T("CreateProcess failed"));
return;
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
}
这里有一点要注意,字符集选用Unicode有异常中断,我也不清楚什么愿意,有大神知道的话请留言。
我是更改为多字符集OK。
b)进程终止
TerminateProcess函数实现强行退出进程,
BOOL TerminateProcess(HANDLE hPrecess, UINT uExitCode);
参数说明:
hProcess :表示需要结束的进程句柄
uExitCode :表示进程结束时的退出代码。
void CMy4_1Process_ThreadDlg::OnBnClickedOpenmspaint()
{
memset(&m_si, 0, sizeof(STARTUPINFO));
m_si.cb = sizeof(STARTUPINFO);//设定大小
memset(&m_pi, 0, sizeof(PROCESS_INFORMATION)); //定义PROCESS_INFOMATION
//打开进程
BOOL res = CreateProcess(NULL, _T("mspaint.exe"), NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &m_si, &m_pi);
if (!res)
{
MessageBox(_T("CreateProcess failed"));
return;
}
//CloseHandle(m_pi.hThread);//关闭子进程的主线程句柄
//CloseHandle(m_pi.hProcess);//关闭子进程句柄
}
void CMy4_1Process_ThreadDlg::OnBnClickedClosemspaint()
{
TerminateProcess(m_pi.hProcess, 0);
CloseHandle(m_pi.hThread);
CloseHandle(m_pi.hProcess);
}