Здравствуйте 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);
}
"разрешить наследование хэндлов дочерним процессом" не в тему, но я пробовал — не пашет!