Puteți utiliza o tehnică similară pe Windows, trebuie doar să utilizați cuvinte diferite pentru aceleași concepte. :) Acest articol: http://msdn.microsoft.com/en-us/ biblioteca/ms682499.aspx utilizează o conductă win32 pentru a manipula I/O dintr-un alt proces, trebuie să faci același lucru cu fire în cadrul aceluiași proces. Bineînțeles, în cazul tău, tot ce iese la stderr de oriunde în proces va fi redirecționat către consumatorul tău.
De fapt, alte piese de puzzle de care ai putea avea nevoie sunt _fdopen și _open_osfhandle . De fapt, iată un exemplu asemănător din cod pe care l-am lansat acum câțiva ani:
DWORD CALLBACK DoDebugThread(void *)
{
AllocConsole();
SetConsoleTitle("Copilot Debugger");
//The following is a really disgusting hack to make stdin and stdout attach
//to the newly created console using the MSVC++ libraries. I hope other
//operating systems don't need this kind of kludge.. :)
stdout->_file = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
stdin->_file = _open_osfhandle((long)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT);
debug();
stdout->_file = -1;
stdin->_file = -1;
FreeConsole();
CPU_run();
return 0;
}
În acest caz, procesul principal a fost un proces GUI care nu pornește deloc cu mânere stdio. Acesta deschide o consolă, apoi împinge mânerele drepte în stdout și stdin astfel încât funcția debug() (care a fost proiectată ca o funcție interactivă stdio) poate interacționa cu consola nou creată. Ar trebui să puteți deschide niște țevi și să faceți același lucru pentru a redirecționa stderr.