Здравствуйте Алекс, Вы писали:

А>Даже так не работает:

А>
А>    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);
А>    }
А>

А>"разрешить наследование хэндлов дочерним процессом" не в тему, но я пробовал — не пашет!

Надо не только разрешить наследование, но и сам хендл сделать наследуемым. Т.е.

void main()
{
    HANDLE hFile;

    SECURITY_ATTRIBUTES sa;

    sa.nLength = sizeof(sa);
    sa.bInheritHandle = TRUE;    
    sa.lpSecurityDescriptor = NULL;
    
    hFile = CreateFile(
                "stdout.txt",
                GENERIC_WRITE | GENERIC_READ, 
                FILE_SHARE_READ | FILE_SHARE_WRITE, 
                &sa,
                OPEN_ALWAYS,
                0,
                NULL);

    SetFilePointer(hFile, 0, NULL, FILE_END);

    STARTUPINFO si = {sizeof(STARTUPINFO)};

    si.hStdOutput = hFile;
    si.dwFlags    = STARTF_USESTDHANDLES;

    PROCESS_INFORMATION pi;

    CreateProcess(NULL, "printer.exe", NULL, NULL, TRUE ,0, 0, 0, &si, &pi);

    CloseHandle(hFile);
}


У меня в таком виде работает.
Автор: SergH    Оценить