4

C プログラムで TEST.exe を実行したいと考えています。使っているうちに

system( "TEST.exe <input-file> output-file" );

私は期待したものを得ることができます。

しかし、次のコードを使用すると、CreateProcessW() が正しく機能しませんでした (外部プログラムを実行するにはどうすればよいですか? を参照してください)。

if (CreateProcessW(const_cast<LPCWSTR>(FullPathToExe.c_str()), 
    pwszParam, 0, 0, false, 
    CREATE_DEFAULT_ERROR_MODE, 0, 0, 
    &siStartupInfo, &piProcessInfo) != false) 
{ 
    /* Watch the process. */ 
    dwExitCode = WaitForSingleObject(piProcessInfo.hProcess,  (SecondsToWait * 1000)); 
    iReturnVal = GetLastError(); 
} 
else 
{ 
    /* CreateProcess failed */ 
    iReturnVal = GetLastError(); 
} 

どこ

FullPathToExe="TEST.exe", pwszParam="TEST.exe <input-file> output-file".

また、WaitForSingleObject() は 258 を返し、GetLastError() は 1813 を返します (「指定されたリソース タイプが画像ファイルに見つかりません。」)。

また、上記の CreateProcessW() コードは、独自の HelloProcess.exe を実行すると正常に動作します (こんにちはを出力し、次の数値で決定される数秒間スリープしてから終了します)。

FullPathToExe="HelloProcess.exe", pwszParam="HelloProcess.exe 10".

何か案は?ヒントをありがとう!

4

3 に答える 3

6

systemコマンドが実行されるインスタンスを実際に生成しcmdます。

システム関数はコマンドをコマンド インタープリターに渡します。コマンド インタープリターは文字列をオペレーティング システム コマンドとして実行します。systemは、コマンド インタープリター ファイル (Windows NT では CMD.EXE という名前のファイル) を見つけるCOMSPECおよびPATH環境変数を参照します。commandが NULL の場合、関数は単にコマンド インタープリターが存在するかどうかを確認します。
—<a href="http://msdn.microsoft.com/en-us/library/277bwbdz.aspx" rel="noreferrer">ドキュメントsystem

<これが、やなどのリダイレクト演算子が機能する理由>です。これは、CreateProcess別のプロセスを実行するシェルの代わりにプロセスを実際に生成する場合には当てはまりません。リダイレクト演算子は OS ではなくシェルの機能であるため、プロセスへの入力と出力を手動で行う必要があります。

于 2012-04-02T08:05:47.183 に答える
3

CreateProcess とコマンド ライン引数の指示どおりに 実行し、問題を修正します。ご清聴ありがとうございました!

便宜上、回答の引用を次に示します。

CreateProcess() でコマンドライン リダイレクト演算子を直接使用することはできません。cmd.exe のインスタンスを生成し、代わりに演算子を渡す必要があります。例:

CreateProcess( "C:\\windows\\system32\\cmd.exe", t_str2, ...)) 

t_str2 は「/CC:\Temp\sift.exe < C:\img1.pgm > C:\img1.key」です。cmd.exe への実際のパスは、%COMSPEC% 環境変数を読み取ることによって決定できます。

于 2012-04-02T12:11:09.143 に答える
0

WaitForSingleObject() は、終了コードではなく、待機結果を返します。https://msdn.microsoft.com/en-us/library/windows/desktop/ms687032(v=vs.85).aspx

258 は WAIT_TIMEOUT です。戻り値 0 (WAIT_OBJECT_0) またはその他のエラーが返されるまで、このエラー コードを再試行する必要があります。

この後、GetExitCodeProcess https://msdn.microsoft.com/en-us/library/windows/desktop/ms683189(v=vs.85).aspx を使用して、プロセスの終了コードを取得します。

于 2016-01-14T01:19:34.977 に答える