MFC中CreateProcess()函数 实例

更新时间:2022-11-08 17:45:22 阅读: 评论:0


2022年11月8日发
(作者:好书推荐作文)

CreateProcess()函数实例记事本

在程序设计时,某一个具体的功能模块可以通过函数或是线程等不同的形式

来实现。对于同一进程而言,这些函数、线程都是存在于同一个地址空间下的,

而且在执行时,大多只对与其相关的一些数据进行处理。如果算法存在某种错误,

将有可能破坏与其同处一个地址空间的其他一些重要内容,这将造成比较严重的

后果。为保护地址空间中的内容可以考虑将那些需要对地址空间中的数据进行访

问的操作部分放到另外一个进程的地址空间中运行,并且只允许其访问原进程地

址空间中的相关数据。具体的,可在进程中通过CreateProcess()函数去创建

一个子进程,子进程在全部处理过程中只对父进程地址空间中的相关数据进行访

问,从而可以保护父进程地址空间中与当前子进程执行任务无关的全部数据。对

于这种情况,子进程所体现出来的作用同函数和线程比较相似,可以看成是父进

程在运行期间的一个过程。为此,需要由父进程来掌握子进程的启动、执行和退

出。下面这段代码即展示了此过程:

//临时变量

CStringsCommandLine;

charcWindowsDirectory[MAX_PATH];

charcCommandLine[MAX_PATH];

DWORDdwExitCode;

PROCESS_INFORMATIONpi;

STARTUPINFOsi={sizeof(si)};

//得到Windows目录

GetWindowsDirectory(cWindowsDirectory,MAX_PATH);

//启动"记事本"程序的命令行

sCommandLine=CString(cWindowsDirectory)+"";

::strcpy(cCommandLine,sCommandLine);

//启动"记事本"作为子进程

BOOLret=CreateProcess(NULL,cCommandLine,NULL,NULL,FALSE,0,

NULL,NULL,&si,&pi);

if(ret){

//关闭子进程的主线程句柄

CloHandle(d);

//等待子进程的退出

WaitForSingleObject(ss,INFINITE);

//获取子进程的退出码

GetExitCodeProcess(ss,&dwExitCode);

//关闭子进程句柄

CloHandle(ss);

}

此段代码首先通过CreateProcess()创建Windows自带的“记事本”程

序为子进程,子进程启动后父进程通过WaitForSingleObject()函数等待其执

行的结束,在子进程没有退出前父进程是一直处于阻塞状态的,这里子进程的作

用同单线程中的函数类似。一旦子进程退出,WaitForSingleObject()函数所

等待的ss对象将得到通知,父进程将得以继续,如有必要可以通过

GetExitCodeProcess()来获取子进程的退出代码。

相比而言,更多的情况是父进程在启动完子进程后就再不与其进行任何数据

交换和通讯,由其创建的子进程的执行成功与否均与父进程无关。许多大型软件

在设计时也多采用了这类思想,将某些功能完全通过独立的应用程序来完成,当

需要执行某操作时只要通过主程序启动相应的子进程即可,具体的处理工作均由

子进程去完成。这类子进程的创建过程更为简单,例如对于上面那段代码只需去

除对子进程句柄ss的等待即可:

BOOLret=CreateProcess(NULL,cCommandLine,NULL,NULL,FALSE,0,

NULL,NULL,&si,&pi);

if(ret){

//关闭子进程的主线程句柄

CloHandle(d);

//关闭子进程句柄

CloHandle(ss);

}

可以通过dwCreationFlags参数在创建进程时设置子进程的优先级。前面

的示例代码在创建子进程时使用的均是默认的优先级,如果要将优先级设置为

高,可以修改如下:

BOOLret=CreateProcess(NULL,cCommandLine,NULL,NULL,FALSE,

HIGH_PRIORITY_CLASS,NULL,NULL,&si,&pi);

如果在进程创建时没有特别设置优先级,可以通过SetPriorityClass()函

数来动态设定,该函数需要待操作进程的句柄和优先级标识符作为入口参数,函

数原型为:

BOOLSetPriorityClass(HANDLEhProcess,DWORDdwPriorityClass);

对于前面没有设定优先级的例子代码,可以在子进程启动后由父进程来动态

改变其优先级设置:

SetPriorityClass(ss,HIGH_PRIORITY_CLASS);

或是由子进程在其启动后自行改变优先级设置,需要注意的是这时进程句柄

应设置为子进程自身的句柄,可通过GetCurrentProcess()函数来获取:

HANDLEhProcess=GetCurrentProcess();

SetPriorityClass(hProcess,HIGH_PRIORITY_CLASS);


本文发布于:2022-11-08 17:45:22,感谢您对本站的认可!

本文链接:http://www.wtabcd.cn/fanwen/fan/82/453941.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:process
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图