CreateProcess を利用してリダイレクションの結果を取得したい

[戻る]
jima 2005/05/23(月) 22:33:13
VC++6.0 MFC WindowsXP sp2

CreateProcess を利用してコマンドプロンプトを立ち上げ、”>”でリダイレクション
でファイルから結果を取得したいのですが、何故か結果が取得できません。
ファイルが作成されないのです。
本来ならば”C:\Output.txt”に結果が表示される
はずなのですが、上手くいきません。
知っている方がいれば教えていただけませんか?

// ここで呼ぶ
f_CreateProcess("C:\", "C:\xxxx.exe > C:\Output.txt");


iPath:実行ファイルのディレクトリ
iCommandParam :コマンド引数


bool f_CreateProcess( CString iPath, CString iCommandParam ){

    
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

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

    // コマンドプロンプトを非表示に設定する。
    // 表示したい時は、これをコメント化する。
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_HIDE;

    // 解凍 unzip aaa
    // バッチファイルを実行する
    if( !CreateProcess( NULL,

                        iCommandParam.GetBuffer
( sizeof(iCommandParam) ),// 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. 
                        iPath.GetBuffer( sizeof
(iPath) ),// Use parent's starting directory. 
                        &si,        
        // Pointer to STARTUPINFO structure.
                        &pi )        
        // Pointer to PROCESS_INFORMATION structure.
    ) 
    {
        return false;
    }

    // プログラム実行終了まで待機
    CloseHandle( pi.hThread );
    WaitForSingleObject( pi.hProcess, INFINITE );

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

Blue 2005/05/23(月) 22:57:24
解答ではないですが
>f_CreateProcess("C:\", "C:\xxxx.exe > C:\Output.txt");
この指定の仕方で動きますか?
エスケープ文字があってうまくいきそうもないですが。。。

孝仁 2005/05/23(月) 23:22:58
すみません。これです。
f_CreateProcess("C:\\", "C:\\xxxx.exe > C:\\Output.txt");

dairygoods 2005/05/24(火) 09:04:37
リダイレクトはコマンドプロンプトの機能ですから、
f_CreateProcess("C:\\", "cmd.exe /c 〜.exe > ファイル");
ではないでしょうか。

jima 2005/05/24(火) 13:52:06
自分で調べた結果、直接は無理ということが分かりました。

http://homepage2.nifty.com/DSS/VCPP/API/CreateProcessRedirect.htm

http://numata.aquasky.jp/programming/vcpp/sys_001.cpp

これらを見て直したのですが、やっぱり上手くうごきません。

// ここで呼ぶ
Test( "C:\\XXX\\CCC.exe");



void Test( CString iZipFileFullPath )
{

    // 取得先ファイルの作成
    SECURITY_ATTRIBUTES sa;
    sa.lpSecurityDescriptor    = NULL;
    sa.nLength                = sizeof
(SECURITY_ATTRIBUTES);
    sa.bInheritHandle        = TRUE;    // 子プロセスへの継承を許可

    HANDLE hFile = CreateFile(            // ファイル名
        "C:\\XXXXX\\Debug\\TempDirectory\\Redirection.txt",
        GENERIC_WRITE,        // 書き込み用
        FILE_SHARE_READ,    // 競合プロセスは読取専用
        &sa,
        CREATE_ALWAYS,
        FILE_ATTRIBUTE_NORMAL,
        NULL
    );
    if (hFile == INVALID_HANDLE_VALUE) {
        cout << "取得先ファイルの作成に失敗." << endl;
        exit(1);
    }

    // 標準出力の出力先を指定してアプリケーションを実行
    STARTUPINFO si;
    ZeroMemory(&si, sizeof(STARTUPINFO));
    si.cb            = sizeof(STARTUPINFO);
    si.dwFlags        = STARTF_USESTDHANDLES;
    si.hStdOutput    = hFile;    // 標準出力
    si.hStdError    = hFile;    // 標準エラー出力

    PROCESS_INFORMATION pi;
    BOOL ret = CreateProcess(
        NULL,
        //argv[1],    // コマンド
        //"unzip -P qlc ddd",
        CommandErrorParam.GetBuffer( sizeof(CommandErrorParam) ),
        NULL, NULL,
        TRUE, 0,
        NULL, 
        //NULL,
        "C:\\HM\\CADExplorer\\Debug\\TempDirectory",
        &si, &pi
    );
    if (!ret) {
        cout << "アプリケーションの実行に失敗." << endl;
        CloseHandle(hFile);
        exit(1);
    }

    // アプリケーションの終了を待つ
    WaitForSingleObject(pi.hProcess, INFINITE);

    // 子プロセス・ファイルを閉じる
    CloseHandle(pi.hProcess);
    CloseHandle(pi.hThread);
    CloseHandle(hFile);
}

各無し 2005/05/24(火) 18:21:23
関係ないけど、GetBufferしたらReleaseBufferしようよ。

# ALGO ?

ギャバ 2005/06/01(水) 12:25:19
CommandErrorParam.GetBuffer( sizeof(CommandErrorParam) )
↑これなに?

古いスレッドには追加発言できません。