创建进程

创建进程
*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是严格区分父进程,子进程的,并且把这种关系记录下来

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值