0

こんにちは、誰かがこの問題で私を助けてくれることを願っています。私は、msdn の次の例を createprocess 関数に使用しています。

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _tmain( int argc, TCHAR *argv[] )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if( argc != 2 )
    {
        printf("Usage: %s [cmdline]\n", argv[0]);
        return;
    }

    // Start the child process. 
    if( !CreateProcess( NULL,   // No module name (use command line)
        argv[1],        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi )           // Pointer to PROCESS_INFORMATION structure
    ) 
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );
        return;
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}

これはdos経由でアクセスされ、コマンドプロンプトでこのコマンドを使用して完全に機能します. これを入力すると

this.exe "my.exe テスト" > result.txt

my.exe は入力テストを実行する別のコンソール アプリケーションであり、> result.txt は出力ログ用です。コマンドラインの必要性を取り除こうとしているので、パスを createprocess 関数呼び出しにフィードしようとしています。これは私が行き詰まるところです ここは私がしようとしているものです

if( !CreateProcess( NULL,   // No module name (use command line)
        "\"my.exe test \" > result.txt",        // this.exe "my.exe test" > result.txt
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable

まだ動作しません \" を実行すると必要な結果が得られると思いましたが、動作していないようです。my.exe とテストの部分は解析しますが、> result.txt の出力は解析しません。ただし、合格すればコマンド プロンプトから正常に動作しますそれをargv[1]に。

どんな助けでも大歓迎です。

要約すると

コンソールで解析できます

this.exe "my.exe test" > result.txt // Works fine via cmd.exe

試したアプリへ

my.exe test > result.txt // Not work but missing ""

\"my.exe test \" > result.txt // work for first section 
4

2 に答える 2

3

CreateProcess実行可能な名前といくつかの引数のみが必要です。リダイレクトは、実際にはプログラムの引数ではありません。これはシェル ( cmd.exe) によって解釈されます。

独自のプログラムを呼び出すと、次のようになります...

cmd> this.exe "my.exe test" > result.txt

argv[0] = "this.exe"
argv[1] = "my.exe test"
Output is sent to result.txt by the shell

さて、うまくいかないもの:

cmd> this.exe my.exe test > result.txt

argv[0] = "this.exe"
argv[1] = "my.exe"
argv[2] = "test"
Output is sent to result.txt by the shell

argv[1]にのみ送信するためCreateProcess、動作が期待どおりではないことがわかります。

さて、前述したように、CreateProcess実際には出力をリダイレクトしません。これを行うには、system呼び出す呼び出しcmd.exeまたはシステムが使用するコマンド インタープリターを使用する必要があります。

system( "my.exe test > result.txt" );

参照: http://msdn.microsoft.com/en-us/library/277bwbdz(v=vs.80).aspx

于 2012-10-24T21:57:26.577 に答える
3

CreateProcess単語を個々の引数に分割することによる基本的なコマンドライン解析のみを行います。ファイルのリダイレクトなどは理解していません。これを渡すと、文字どおりと"> result.txt"という名前の 2 つの引数として解析しようとします。">""result.txt"

コマンドの出力をリダイレクトする場合は、次の 2 つのオプションがあります。

  1. リダイレクトは自分で行います。CreateFileこれを行うには、最初に(ハンドルを継承可能にするセキュリティ属性を渡して)ファイルを開き、渡しhStdOutた構造体のメンバーに結果のハンドルを割り当てます。次に、リターンSTARTUPINFO後にファイルを閉じることを忘れないでください。CreateProcessそうしないと、ハンドルがリークするためです。
  2. 別のプログラムを使用してリダイレクトを行います。コマンド ラインにコマンドを入力すると、コマンド ラインcmd.exeが解析され、ファイルのリダイレクトが行われます。したがって、プロセスを作成する代わりに、次のようなコマンド ラインでプロセスをmy.exe作成できます。cmd.exe

    cmd.exe "my.exe test > result.txt"
    
于 2012-10-24T21:54:32.810 に答える