2

Cプログラム(win32 API)内でstdinを選択したファイルにリダイレクトしようとしていますが、stderrまたはstdoutもリダイレクトする可能性があります。

私はcygwinで実行しているシェルを書いています。望ましい効果は、 cat < file が機能することです。

これまでの私のコードは次のとおりです。

    static HANDLE createinputHandle(PCSTR filename, SECURITY_ATTRIBUTES sa)
    {
            return CreateFile(
                 filename,
                 GENERIC_READ,
                 FILE_SHARE_READ,
                 NULL,
                 OPEN_ALWAYS,
                 FILE_ATTRIBUTE_NORMAL,
                 NULL);
    }


    static VOID RedirectHandle(STARTUPINFO *psi, HANDLE hFile, INT opt)
    {
        if (hFile == INVALID_HANDLE_VALUE)
            return;

        psi->dwFlags |= STARTF_USESTDHANDLES;

        switch (opt) {
        case STD_INPUT_HANDLE:
            psi->hStdInput = GetStdHandle(STD_INPUT_HANDLE);
            psi->hStdInput = hFile;
            break;
        case STD_OUTPUT_HANDLE:
            psi->hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);
            psi->hStdOutput = hFile;
            break;
        case STD_ERROR_HANDLE:
            psi->hStdError = GetStdHandle(STD_ERROR_HANDLE);
            psi->hStdError = hFile;
            break;
        }

command_func() {
 STARTUPINFO si;
 PROCESS_INFORMATION pi;
 bool result;
 DWORD wait_result;
 HANDLE inHandle, outHandle, errHandle;
 SECURITY_ATTRIBUTES sa;

 ZeroMemory(&si, sizeof(si)); //macro to init with zero's
 si.cb = sizeof(si);
 ZeroMemory(&pi, sizeof(pi));
 ZeroMemory(&sa, sizeof(sa));
 sa.bInheritHandle = TRUE;

 inHandle = INVALID_HANDLE_VALUE;
 outHandle = INVALID_HANDLE_VALUE;
 errHandle = INVALID_HANDLE_VALUE;

     if(inputFile != NULL) {

        inHandle = createinputHandle(inputFile, sa);
            SetHandleInformation(inHandle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);
            //added
        RedirectHandle(&si, inHandle, STD_INPUT_HANDLE);

     }


result = CreateProcess(
            NULL,
            cmd, /*if you want to test this, you need to change cmd to something like "ls -l" */
            NULL,
            NULL,
            TRUE,
            0,
            NULL,
            NULL,
            &si,
            &pi); 
}

この stdin リダイレクトが機能しません。何が間違っていますか?

ありがとうございました !

4

1 に答える 1

2

あなたはほとんどそこにいます:)使用:::SetHandleInformation(inHandle, HANDLE_FLAG_INHERIT, HANDLE_FLAG_INHERIT);

于 2013-03-30T19:19:39.803 に答える