创建进程
*CreateProcess
ExitProcess(自己结束自己)
TerminateProcess(一个进程结束另一个 进程)
*STARTUPINFO //创建进程的启动信息结构
*PROCESS_INFORMATION //进程的信息结构
*GetCommandLine //获取创建进程的命令行
*GetCurrentProcesslId //获取当前进程ID
新建一个MFC应用程序项目,添加一个创建子进程的按钮,然后双击按钮,编写函数处理该按钮的响应
void C创建进程Dlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si,sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcess(TEXT("C:\\Windows\\System32\\calc.exe"),//可执行文件路径
NULL,//命令行参数,这里不需要
NULL,//创建的进程的安全属性,设为NULL,即默认安全属性
NULL,//进程的线程的安全属性
FALSE,//继承句柄,不继承,设为NULL
0,//创建标志设为0
NULL,//使用父进程的环境变量
NULL,//使用父进程的当前目录作为子进程的当前目录
&si,//STARTUPINFO结构指针
&pi//PROCESS_INFORMATION结构指针
))
{
CString s;
s.Format(TEXT("创建进程失败:%d"), GetLastError());
MessageBox(s);
return;
}
}
然后运行项目,这个窗口是父进程(或主进程)
然后出来的窗口就是子进程
这里的子进程已经做好的,接下来添加一个MFC应用程序项目,作为子进程,可以自己结束自己,就用ExitProcess();也可以远程,用其他进程结束该进程,
(这里CPChild写错了,就不改了)
用父进程结束子进程要用PROCESS_INFORMATION结构,因为创建进程时该结构保存了相关信息,比如句柄,ID等等,为此,需要将这两个结构改为全局变量,然后调用TerminateProcess(pi.hProcess,0);即可
显示当前进程ID可以用GetCurrentProcessId得到,显示创建的进程ID就可以用PROCESS_INFORMATION结构得到,
可见结果是正确的
进程在启动的时候可以有命令行参数,再做一个记事本的进程吧(和计算器在同一文件夹下),记事本可以有命令行参数,比如当前目录下有文本文件,用cmd执行notepad.exe会打开记事本(空的),加上参数(notepad.exe file.txt)就会打开该文件
注意:带命令行参数,调用CreateProcess函数时,第二个参数要加一个空格,如果只写文件名而不写路径,文件需要和项目在同一个文件夹
命令行参数可以通过父进程传递给子进程,子进程可以获得命令行参数,调用函数GetCommandLine()即可,还有就是Window里进程都是平等的,并不区分谁是父进程谁是子进程,只是我们习惯了这种叫法而已,而其他操作系统比如Unix,Linux是严格区分父进程,子进程的,并且把这种关系记录下来