C++,在windows下调用子进程,并获得子进程的返回值 (在Qt平台实现)

copy自

c++,在windows下调用子进程,并获得子进程的返回值。

只是为了自己学习整理一下。

侵删

被调用的进程

在windows下,将子进程函数(subapp.cpp)封装成exe。封装成exe的方法见打包的文章

subapp.cpp

代码:
我注释掉了 getchar(); 这样不会卡在子进程。
//主线程传入的类型是 char* 类型的,如果需要传入浮点型或者string 类型,就需要 ,char[] 转 string

#pragma execution_character_set("utf-8")
#include<iostream>
#include<string>
using namespace std;
int main(int argc,char* argv[])
{
    std::cout << "this is subApp messagez" << std::endl;

    std::cout << "argc"<<argc<< std::endl;
    if (argc>= 2)
    {
        std::cout << "work... pass,the return code will be 0" << std::endl;
        char a = *argv[1];//传进来的是 -1 为什么是符号
        char b = *argv[2];
        char c = *argv[3];
        string c1 = argv[3];
        char d = *argv[4];
        // char*转换为string
        char e = *argv[5];
        string st1 = argv[5];
//        QString qstr;
//        qstr = QString::fromStdString(str1);
        std::cout <<a <<" "<< b <<" "<<c1<<" " << d <<" "<< st1 <<std::endl;
        getchar();
        return 0;
    }
    else//如果参数数量小于2
    {
        std::cout << "work... failed,the return code will be 1" << std::endl;
        getchar();
        return 1;
    }

}

写好代码后,直接运行会显示 "work... failed,the return code will be 1",因为总参数数量小于2。将其打包成exe,拷贝出其所需要的dll库。放在工程文件夹中。(Qt工程的debug/release文件夹中)。

主进程

在主进程中,使用for循环,调用子进程。这里for循环5次,也就是调用5次子进程。

main.cpp

代码:

#include<iostream>
#include<windows.h>
int main(int argc, char*argv[])
{
   for(int i = 0 ;i<5 ; i++){
   STARTUPINFO si = { sizeof(STARTUPINFO) };//在产生子进程时,子进程的窗口相关信息
   PROCESS_INFORMATION pi;                  //子进程的ID/线程相关信息
   DWORD returnCode;//用于保存子程进的返回值;

   wchar_t commandLine1[] = L"subapp.exe -l 1 hello 3 www.helllp=.cn";  //测试命令行参数一
   wchar_t commandLine2[] = L"subapp.exe";     //测试命令行参数二

   //
   BOOL bRet = CreateProcess(              //调用失败,返回0;调用成功返回非0;
       NULL,                               //一般都是空;(另一种批处理情况:此参数指定"cmd.exe",下一个命令行参数 "/c otherBatFile")
       commandLine1,                       //命令行参数
       NULL,                               //_In_opt_    LPSECURITY_ATTRIBUTES lpProcessAttributes,
       NULL,                               //_In_opt_    LPSECURITY_ATTRIBUTES lpThreadAttributes,
       FALSE,                              //_In_        BOOL                  bInheritHandles,
       CREATE_NEW_CONSOLE,                 //新的进程使用新的窗口。
       NULL,                               //_In_opt_    LPVOID                lpEnvironment,
       NULL,                               //_In_opt_    LPCTSTR               lpCurrentDirectory,
       &si,                                //_In_        LPSTARTUPINFO         lpStartupInfo,
       &pi);                               //_Out_       LPPROCESS_INFORMATION lpProcessInformation

   if (bRet)
   {
       std::cout << "process is running..." << std::endl;
       //等待子进程结束
       WaitForSingleObject(pi.hProcess, -1);
       std::cout << "process is finished"  << std::endl;
       //获取子进程的返回值
       GetExitCodeProcess(pi.hProcess, &returnCode);
       std::cout << "process return code:" << returnCode << std::endl;
   }
   else
   {
       std::cout << "Create Process error!"<<std::endl;
       return 0;
   }

//    getchar();
   CloseHandle(pi.hThread);
   CloseHandle(pi.hProcess);
}

   return 0;
}

直接运行主进程,会出现五个框。显示

process is running...
process is finished
process return code:0
process is running...
process is finished
process return code:0
process is running...
process is finished
process return code:0
process is running...
process is finished
process return code:0
process is running...
process is finished
process return code:0

也就是调用了5次子进程。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值