1

C++ では、別の実行可能ファイルを呼び出して実行し、その実行可能ファイルから戻り値を受け取ることができますか (たとえば、他の exe が操作を正常に実行したかどうかを示す 1 または 0)?

簡単にするために、次の例を取り上げます。filelist.exe という名前の外部コンソール .exe があり、ディレクトリ内のすべてのファイルを一覧表示し、それらのファイル名をファイルに書き込みます。filelist.exe が正常に実行された場合、main は 1 を返し、そうでない場合は 0 を返します。

次のコードを使用して filelist.exe を実行した場合、filelist.exe から戻り値を取得する方法はありますか?

int res = system("filelist.exe dirPath");

// Maybe the windows function CreateProcess() allows filelist.exe to return
// a value to the currently running application?
CreateProcess();

注: ディレクトリ内のファイルを一覧表示する単純なコンソール アプリケーションを作成するつもりはありません ユーザーがサードパーティ プログラムの有効なバージョンを持っているかどうかを確認し、有効なバージョンを持っている場合は 1 を返すコンソール アプリケーションを作成しようとしています。そうでない場合は 0。

4

2 に答える 2

3

例は次のようになります。

    res = CreateProcess(
        NULL,                //  pointer to name of executable module  
        commandLine,         //  pointer to command line string  
        NULL,                //  pointer to process security attributes  
        NULL,                //  pointer to thread security attributes  
        TRUE,                //  handle inheritance flag  
        0,                   //  creation flags  
        NULL,                //  pointer to new environment block  
        NULL,                //  pointer to current directory name  
        &StartupInfo,        //  pointer to STARTUPINFO  
        &ProcessInfo         //  pointer to PROCESS_INFORMATION  
      );

    if (!res)
      //  process creation failed!
      {
        showError(commandLine);
        retVal = 1;
      }
    else if (waitForCompletion)
      {
        res = WaitForSingleObject(
                ProcessInfo.hProcess,  
                INFINITE      // time-out interval in milliseconds  
                );  
        GetExitCodeProcess(ProcessInfo.hProcess, &exitCode);

        retVal = (int)exitCode;
      }

Process外部プロセスのリターン コードは、を使用してオブジェクトから取得されますGetExitProcess()。これは、コードがプロセスの開始後に完了を待っていることを前提としています。

于 2013-01-13T20:39:24.263 に答える
2

はい、別のプロセスを開始して実行可能ファイルを実行します。あなたが求めているのはプロセス間通信と呼ばれ、通常、あなたのようなシナリオではシグナルまたはパイプのいずれかを介して達成されます。

于 2013-01-12T04:41:31.660 に答える