进程通信之三 父进程传参数与子进程返回值

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

本文配套程序下载地址为:http://download.youkuaiyun.com/detail/morewindows/5165733

转载请标明出处,原文地址:http://blog.youkuaiyun.com/morewindows/article/details/8646902

欢迎关注微博:http://weibo.com/MoreWindows

 

前面已经写了使用WM_COPYDATA消息来完成进程之间的通信

1.《进程通信之一使用WM_COPYDATA C++及C#实现》

http://blog.youkuaiyun.com/morewindows/article/details/6804157

然后用了三篇文章来讲解如何使用管道技术来完成进程通信功能。

1.《进程通信之二管道技术第一篇输入输出的重定向

http://blog.youkuaiyun.com/morewindows/article/details/7390350

2.《进程通信之二管道技术第二篇匿名管道

http://blog.youkuaiyun.com/morewindows/article/details/7390441

3.《进程通信之二管道技术第三篇命名管道

http://blog.youkuaiyun.com/morewindows/article/details/8260087

 

    本篇介绍一个简单而又实用的进程通信方式——父进程向子进程传入参数并获取子进程返回值。这个非常简单:

1.父进程向子进程传入参数可以由CreateProcess()函数来完成,注意子进程是通过GetCommandLine()来获取这个参数而且不是char *argv[]。

2.父进程要获取子进程的返回值可以在等待子进程结束后通过GetExitCodeProcess并传入子进程句柄来获取子进程中main或WinMain函数的返回值。

下面就结出实例代码,首先来看子进程的程序代码:

//进程通信之三 父进程传参数与子进程返回值//http://blog.youkuaiyun.com/morewindows/article/details/8683830//By MoreWindows( http://blog.youkuaiyun.com/MoreWindows )#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <time.h>#include <string.h>int main(int argc, char *argv[])// 通过GetCommandLine()获取父进程通过CreateProcess传给子进程的参数 // 注意这与argv[]不同如strlen(argv[1])会出错 srand((unsigned int)time(NULL)); return strlen(GetCommandLine()) + rand() % 10;}

然后是父进程的程序代码,代码中的AdjustProcessCurrentDirectory();函数可以参考《Windows VC++ 调整进程当前目录为程序可执行文件所在目录》(http://blog.youkuaiyun.com/morewindows/article/details/8683519):

//进程通信之三 父进程传参数与子进程返回值//http://blog.youkuaiyun.com/morewindows/article/details/8683830//By MoreWindows( http://blog.youkuaiyun.com/MoreWindows )#include <windows.h>#include <stdio.h>#include <string.h>#include <conio.h>// 启动子进程并传入参数,等待子进程结束后获取其返回值。BOOL GetChildProcessExitCode(const char *pstrChildProcessExeFileName,         char *pstrConmandLine,         DWORD *pdwExitCode, BOOL fHide = TRUE)//子进程启动信息设置    STARTUPINFO si;      si.cb = sizeof(STARTUPINFO);      GetStartupInfo(&si);        si.wShowWindow = fHide ? SW_HIDE : SW_SHOW;    si.dwFlags     = STARTF_USESHOWWINDOW;   // 运行子进程并等待其结束 PROCESS_INFORMATION pi;    CreateProcess(pstrChildProcessExeFileName, pstrConmandLine, NULL, NULL, TRUE, NULL, NULL, NULL, &si, &pi);   WaitForSingleObject(pi.hProcess, INFINITE);    // 获取子进程返回值 BOOL flag = GetExitCodeProcess(pi.hProcess, pdwExitCode); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return flag;}int main()printf("    进程通信之三 父进程传参数与子进程返回值\n");         printf(" - http://blog.youkuaiyun.com/morewindows/article/details/8683830 -\n"); printf(" -- By MoreWindows( http://blog.youkuaiyun.com/MoreWindows ) --\n\n");   AdjustProcessCurrentDirectory();  const char *pstrChildProcessExeFileName = "ChildProcess.exe"const int RUN_CHILDPROCESS_NUMBER = 5char szCommandLine[30] = "MoreWindows"int nCommandLineLen = strlen(szCommandLine); for (int i = 0; i < RUN_CHILDPROCESS_NUMBER; i++)    {  // 运行子进程并获取返回值  DWORD dwExitCode;  if (GetChildProcessExitCode(pstrChildProcessExeFileName, szCommandLine, &dwExitCode, TRUE))   printf("子进程返回值为 %d\n", dwExitCode - nCommandLineLen);  else   printf("GetExitCodeProcess()失败  %d\n", GetLastError());  Sleep(1000); } getch(); return 0;}

程序运行结果如下:

 

 本文配套程序下载地址为:http://download.youkuaiyun.com/detail/morewindows/5165733

转载请标明出处,原文地址:http://blog.youkuaiyun.com/morewindows/article/details/8646902

欢迎关注微博:http://weibo.com/MoreWindows


 


           

给我老师的人工智能教程打call!http://blog.youkuaiyun.com/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值