Нужно перенаправть STDOUT, например. Но не в файл или консоль, а в функцию, чтобы по каждому
cout << "Some Data"
Происходил вызов функции
void stoout_function(void* data_ptr, int size)
{
}
Но все должно работать не только с моим, но и процессами-наследниками, в.т.ч. консольными. Читал про MailSlots и про NamedPipes. Что в моем случае надо копать?
Обычно перенаправление ввода-вывода производиться при запуске процесса. В Win32 — это CreateProcess. При вызове можно указать дескрипторы для stdin stdout и stderr. HANDLE используется любой, но я обычно использую неименованые каналы (pipes) см. CreatePipe
Re[2]: Как перенаправить стандатртые потоки?
От:
Аноним
Дата:
17.12.05 19:14
Оценка:
Здравствуйте, s_viy, Вы писали:
_>Обычно перенаправление ввода-вывода производиться при запуске процесса. В Win32 — это CreateProcess. При вызове можно указать дескрипторы для stdin stdout и stderr. HANDLE используется любой, но я обычно использую неименованые каналы (pipes) см. CreatePipe
Спасибо, посмотрел каналы, разобрался, но цели так и не добился. Если Вас не затруднит, разъясните, пожайлуста следующие моменты.
1. Допустим, я создал трубу. Хендлы назвал h_read и h_end. Какие мне надо ставть SECURITY_ATTRIBUTES, и что это такое?
2. Я написал:
SetStdHandle(STD_OUTPUT_HANDLE, h_write);
Означает ли это, что теперь весь стандартный вывод будет идти по этой трубе?
3. Я написал
std::cout << "Hello!";
Означает ли это, что я направил "Hello" в стандартный вывод?
4. Допустим, для варианта с CreateProcess все ясно. Но теперь я пишу
system("dir");
Как заставить вывод этой комманды идти не в консоль (которая сразу создается и пропадает), а идти в мою трубу. Когда я делал консоль сам (AllocConsole()), все порожденные процессы писали в мою консоль, как заставить их не создавать свою консоль, а писать в мою трубу?
Буду очень благодарен за ответы.
Re[3]: Как перенаправить стандатртые потоки?
От:
Аноним
Дата:
18.12.05 11:49
Оценка:
А>Спасибо, посмотрел каналы, разобрался, но цели так и не добился. Если Вас не затруднит, разъясните, пожайлуста следующие моменты. А>1. Допустим, я создал трубу. Хендлы назвал h_read и h_end. Какие мне надо ставть SECURITY_ATTRIBUTES, и что это такое? А>2. Я написал: А>
А>SetStdHandle(STD_OUTPUT_HANDLE, h_write);
А>
А>Означает ли это, что теперь весь стандартный вывод будет идти по этой трубе? А>3. Я написал А>
А>std::cout << "Hello!";
А>
А>Означает ли это, что я направил "Hello" в стандартный вывод? А>4. Допустим, для варианта с CreateProcess все ясно. Но теперь я пишу А>
А>system("dir");
А>
А>Как заставить вывод этой комманды идти не в консоль (которая сразу создается и пропадает), а идти в мою трубу. Когда я делал консоль сам (AllocConsole()), все порожденные процессы писали в мою консоль, как заставить их не создавать свою консоль, а писать в мою трубу? А>Буду очень благодарен за ответы.
1) SECURITY_ATTRIBUTES ставь NULL
2) Да
3) Да
4) Что Вам мешает использовать CreateProcess для "dir"? Может в вашем случае проще перенаправить потоки средствами коммандной строки посредством разделителья "|". Например: dir *.* | you.exe. В этом случае все данные которые раньше выводились на консоль будут перегаправлены на стандартный ввод you.exe.
Здравствуйте, Аноним, Вы писали:
А>1) SECURITY_ATTRIBUTES ставь NULL А>2) Да А>3) Да А>4) Что Вам мешает использовать CreateProcess для "dir"? Может в вашем случае проще перенаправить потоки средствами коммандной строки посредством разделителья "|". Например: dir *.* | you.exe. В этом случае все данные которые раньше выводились на консоль будут перегаправлены на стандартный ввод you.exe.
Проблема в том, что при создании процесса создается HANDLE’s стандартных потоков и их дескрипторы (1,2 и 3). В начале они совпадают, но SetStdHandle переопределяет только HANDLE’s. Здесь скрыт еще подвох в том, что WriteFile не буферизирует данные при записи в файл, а cout буферизирует… Короче, если не хотите геморроя, то не мешайте API вызовы, Run-Time и STL.