Re[4]: Перенаправление ввода-вывода консоли
От: Алекс Россия http://wise-orm.com
Дата: 09.05.02 15:06
Оценка:
Здравствуйте Alex Fedotov, Вы писали:

AF>Здравствуйте SergH, Вы писали:


SH>>Здравствуйте Dutchman, Вы писали:


D>>>Гляди:


SH>>[skip]


SH>>Вот такой процесс-родитель:


SH>>
SH>>#include <windows.h>

SH>>void main()
SH>>{
SH>>    HANDLE hFile;
SH>>    
SH>>    hFile = CreateFile(
SH>>                "stdout.txt",
SH>>                GENERIC_WRITE | GENERIC_READ, 
SH>>                FILE_SHARE_READ | FILE_SHARE_WRITE, 
SH>>                NULL,
SH>>                OPEN_ALWAYS,
SH>>                0,
SH>>                NULL);

SH>>    SetFilePointer(hFile, 0, NULL, FILE_END);

SH>>    STARTUPINFO si = {sizeof(STARTUPINFO)};

SH>>    si.hStdOutput = hFile;

SH>>    PROCESS_INFORMATION pi;

SH>>    CreateProcess(NULL, "printer.exe", NULL, NULL, FALSE, CREATE_NO_WINDOW, 0, 0, &si, &pi);

SH>>    // MessageBox(NULL, "Press OK", "", MB_OK);
SH>>    CloseHandle(hFile);
SH>>}
SH>>


SH>>Запускает такого потомка:


SH>>
SH>>#include <stdio.h>

SH>>void main()
SH>>{
SH>>    printf("Hello, World");
SH>>}
SH>>


SH>>И не работает! В смысле файл stdout.txt пуст. На экран, правда, тоже ничего не выводится. Если сделать hFile наследуемым, лучше не становится. Если убрать CREATE_NO_WINDOW тоже. Неужели этот механизм не предназначен для файлов, а только для каналов?


AF>A если si.dwFlags = STARTF_USESTDHANDLES добавить и разрешить наследование хэндлов дочерним процессом, заработает?


Даже так не работает:
    STARTUPINFO si = {sizeof(STARTUPINFO)};
    GetStartupInfo(&si);
    si.dwFlags = STARTF_USESTDHANDLES;
    si.hStdOutput = hFile;

    PROCESS_INFORMATION pi;
    ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));

    if (CreateProcess(NULL, "rs1.exe", NULL, NULL, FALSE, CREATE_NEW_CONSOLE/*CREATE_NO_WINDOW*/, 0, 0, &si, &pi)){
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    }
    else{
    int err = GetLastError();
    printf("Error code %d",err);
    }

"разрешить наследование хэндлов дочерним процессом" не в тему, но я пробовал — не пашет!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.