C++、windowsでサブプロセスを呼び出し、サブプロセスの戻り値を取得する(Qtプラットフォームで実現)
3829 ワード
copy:自
c++、windowsの下でサブプロセスを呼び出し、サブプロセスの戻り値を取得します.
自分で勉強するために整理するだけです.
に侵入
呼び出されたプロセス
Windowsで、サブプロセス関数(subapp.cpp)をexeにカプセル化します.exeにカプセル化する方法は、パッケージされた文章を参照してください.
subapp.cpp
コード:getchar()を注釈しました.これでサブプロセスに引っかかりません.//プライマリスレッドの転送タイプはchar*タイプで、フローティングタイプまたはstringタイプを転送する必要がある場合は、char[]回転stringが必要です.
コードが作成されると、合計パラメータ数が2未満のため、
メインプロセス
メインプロセスでは、forループを使用してサブプロセスを呼び出します.ここでforループは5回,すなわち5次サブプロセスを呼び出す.
main.cpp
コード:
メインプロセスを直接実行すると、5つのボックスが表示されます.表示
つまり5つのサブプロセスが呼び出された.
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つのサブプロセスが呼び出された.