2

まず、私はC++を初めて使用します。

私は次のことを達成したいと思っています。

  • 次のコマンドを実行します:「SampleApp.exe-cftest.xml」
  • 非表示モードで実行されるシェルが必要です
  • SampleAppが終了するまでC++アプリケーションを待機する必要があります
  • SampleAppにX時間以上かかる場合は、プロセスを終了する必要があります
  • SampleAppの出力をファイル(sample.log)にパイプしたい

これまでのところ、私は次のものを持っています:

SHELLEXECUTEINFO lpExecInfo;
lpExecInfo.cbSize  = sizeof(SHELLEXECUTEINFO);
lpExecInfo.lpFile = L"SampleApp.exe";
lpExecInfo.fMask = SEE_MASK_DOENVSUBST|SEE_MASK_NOCLOSEPROCESS;     
lpExecInfo.hwnd = NULL;  
lpExecInfo.lpVerb = L"open";
lpExecInfo.lpParameters = L"-cf test.xml";
lpExecInfo.lpDirectory = NULL;
lpExecInfo.nShow = SW_HIDE; // hide shell during execution
lpExecInfo.hInstApp = (HINSTANCE) SE_ERR_DDEFAIL;
ShellExecuteEx(&lpExecInfo);

// wait until the process is finished
if (lpExecInfo.hProcess != NULL)
{
    ::WaitForSingleObject(lpExecInfo.hProcess, INFINITE);
    ::CloseHandle(lpExecInfo.hProcess);
}

上記のコードは、出力をファイルにパイプすることを除いてすべてを実現します。ただし、ShellExecuteでは不可能なようです。代わりにCreateProcessを使用する必要があるようです。C ++の経験が豊富な人が、私のコードとパイプ出力に相当するCreateProcessを提供してくれることを願っています。そうでない場合は、少なくとも私がやりたいことが可能であることを確認し、正しい方向に向けてください。

- ありがとう

4

2 に答える 2

4

特にマゾヒスティックであると感じている場合、またはこの操作を本当に最適化する必要がある場合を除いて、を使用_popenして子プロセスを作成します。FILE *これにより、子の出力を読み取ることができるが返されます。そこから読み取り、ファイルに書き込み、完了しました。

FILE *child = _popen("child.exe", "r");
FILE *result = fopen("result.txt", "w");

// error checking omitted.

char buffer[1024];

while (fgets(buffer, sizeof(buffer), child))
    fputs(buffer, result);

これを(Windows APIを使用して)自分で行うことは確かに可能であり、オーバーヘッドを減らすことさえできますが、それは非常に多くの作業です。

于 2012-12-04T17:06:33.223 に答える
1

まさにあなたがやりたいことなので、あなたはこのコードに慣れたいと思うでしょう。関数内のファイルに書き込むためのコードを追加する必要がありReadFromPipeます。

于 2012-12-04T15:17:24.613 に答える