C++、windowsでサブプロセスを呼び出し、サブプロセスの戻り値を取得する(Qtプラットフォームで実現)

3829 ワード

copy:自
c++、windowsの下でサブプロセスを呼び出し、サブプロセスの戻り値を取得します.
自分で勉強するために整理するだけです.
に侵入
呼び出されたプロセス
Windowsで、サブプロセス関数(subapp.cpp)をexeにカプセル化します.exeにカプセル化する方法は、パッケージされた文章を参照してください.
subapp.cpp
コード:getchar()を注釈しました.これでサブプロセスに引っかかりません.//プライマリスレッドの転送タイプはchar*タイプで、フローティングタイプまたはstringタイプを転送する必要がある場合は、char[]回転stringが必要です.
#pragma execution_character_set("utf-8")
#include
#include
using namespace std;
int main(int argc,char* argv[])
{
    std::cout << "this is subApp messagez" << std::endl;

    std::cout << "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 <

コードが作成されると、合計パラメータ数が2未満のため、"work... failed,the return code will be 1"が直接実行されます.これをexeにパッケージ化し、必要なdllライブラリをコピーします.プロジェクトフォルダに入れます.(Qtエンジニアリングのdebug/releaseフォルダ内).
メインプロセス
メインプロセスでは、forループを使用してサブプロセスを呼び出します.ここでforループは5回,すなわち5次サブプロセスを呼び出す.
main.cpp
コード:
#include
#include
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!"<<:endl return="" getchar="" closehandle=""/>

メインプロセスを直接実行すると、5つのボックスが表示されます.表示
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つのサブプロセスが呼び出された.