CreateProcess 函数 实例 记事本

    在程序设计时,某一个具体的功能模块可以通过函数或是线程等不同的形式来实现。对于同一进程而言,这些函数、线程都是存在于同一个地址空间下的,而且在执行时,大多只对与其相关的一些数据进行处理。如果算法存在某种错误,将有可能破坏与其同处一个地址空间的其他一些重要内容,这将造成比较严重的后果。为保护地址空间中的内容可以考虑将那些需要对地址空间中的数据进行访问的操作部分放到另外一个进程的地址空间中运行,并且只允许其访问原进程地址空间中的相关数据。具体的,可在进程中通过CreateProcess()函数去创建一个子进程,子进程在全部处理过程中只对父进程地址空间中的相关数据进行访问,从而可以保护父进程地址空间中与当前子进程执行任务无关的全部数据。对于这种情况,子进程所体现出来的作用同函数和线程比较相似,可以看成是父进程在运行期间的一个过程。为此,需要由父进程来掌握子进程的启动、执行和退出。下面这段代码即展示了此过程:

// 临时变量
CString sCommandLine;
char cWindowsDirectory[MAX_PATH];
char cCommandLine[MAX_PATH];
DWORD dwExitCode;
PROCESS_INFORMATION pi;
STARTUPINFO si = {sizeof(si)};
// 得到Windows目录
GetWindowsDirectory(cWindowsDirectory, MAX_PATH);
// 启动"记事本"程序的命令行
sCommandLine = CString(cWindowsDirectory) + "\\NotePad.exe";
::strcpy(cCommandLine, sCommandLine);
// 启动"记事本"作为子进程
BOOL ret = CreateProcess(NULL, cCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if (ret) {
    // 关闭子进程的主线程句柄
    CloseHandle(pi.hThread);
    // 等待子进程的退出
    WaitForSingleObject(pi.hProcess, INFINITE);
    // 获取子进程的退出码
    GetExitCodeProcess(pi.hProcess, &dwExitCode);
    // 关闭子进程句柄
    CloseHandle(pi.hProcess);
} 

  此段代码首先通过CreateProcess()创建Windows自带的“记事本”程序为子进程,子进程启动后父进程通过WaitForSingleObject()函数等待其执行的结束,在子进程没有退出前父进程是一直处于阻塞状态的,这里子进程的作用同单线程中的函数类似。一旦子进程退出,WaitForSingleObject()函数所等待的pi.hProcess对象将得到通知,父进程将得以继续,如有必要可以通过GetExitCodeProcess()来获取子进程的退出代码。


  相比而言,更多的情况是父进程在启动完子进程后就再不与其进行任何数据交换和通讯,由其创建的子进程的执行成功与否均与父进程无关。许多大型软件在设计时也多采用了这类思想,将某些功能完全通过独立的应用程序来完成,当需要执行某操作时只要通过主程序启动相应的子进程即可,具体的处理工作均由子进程去完成。这类子进程的创建过程更为简单,例如对于上面那段代码只需去除对子进程句柄pi.hProcess的等待即可:

BOOL ret = CreateProcess(NULL, cCommandLine, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
if (ret) {
    // 关闭子进程的主线程句柄
    CloseHandle(pi.hThread);
    // 关闭子进程句柄
    CloseHandle(pi.hProcess);
} 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CreateProcess函数是一个Windows API函数,用于创建一个新的进程。它的功能是根据指定的可执行文件名、命令行参数、进程安全属性等参数,创建一个新的进程,并返回新进程的句柄和标识符。 使用CreateProcess函数可以很方便地创建新的进程,实现并行执行多个任务的功能。它通常在编写Windows应用程序时使用,可以创建包括GUI和控制台程序在内的各种类型的进程。 使用CreateProcess函数需要提供一些必要的参数,包括可执行文件名和命令行参数,这些参数可以指定新进程要执行的具体任务。还可以指定一些可选的参数,如进程安全属性、标准输入输出的重定向等。通过这些参数的设置,可以灵活地控制新进程的行为。 CreateProcess函数创建新进程后,会返回一个句柄和标识符,可以用于其他操作,如监视进程状态、与新进程进行通信等。可以通过这些句柄和标识符来控制和管理新进程,实现进程间的交互和同步。 在使用CreateProcess函数时,需要注意一些问题,如确保传递给它的参数正确有效,保证新进程的可靠运行,防止资源泄漏等。同时,需要对新进程进行适当的管理和关闭,以避免产生僵尸进程或资源浪费问题。 总之,CreateProcess函数是一个重要的Windows API函数,能够创建新的进程,并提供了丰富的参数和功能,能够满足不同需求下的进程创建和管理。通过它的使用,可以实现进程间的并行执行和相互通信,提高应用程序的性能和灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值