| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > Перенаправление стандартных потоков |
| Автор: Nastya 2.4.2005, 13:34 |
| Такая ситуация, надо перенаправить поток stdout, так что бы при использовании функций printf, puts и т.д. все выводимые данные выводились в мое окно (а конкретно в RichEdit на нем). При этом это должно происходить не только в моем модуле, но и во всех загружаемых моим модулях dll-ках. Т.е есть все printf -ы в моей программе со всеми вызываемыми ею примочками должны итди в мое окно. О как!!!! Кто поможет? |
| Автор: Sun 4.4.2005, 11:08 | ||
Самое простое решение - перенаправить вывод в пайп.
Дальше используя файловый дескриптор out читать из него данные. |
| Автор: Nastya 4.4.2005, 11:30 | ||
| Sun, все хорошо но есть два но 1. Это то что приложение у меня НЕ консольное. 2. При таком расскладе как написал ты (или почти таком) в нутри приложение все работает, а вот функции, вызываемой dll выводят в некуда а ради них все и затевалась. Объясняю ситуацию. Для упрощения работаю не с pipe, а с дисковым фалом (приблизительно так)
Так вот фраза "This is from Maindlg\r\n" в файл благополучно записалась, а вот тот printf, который был в функции ушел в некуда. Дальше инетересние. Значенеи переменой stdout (это 1-ый элемент массива _iob, описанный в stdlib.h) имеет разные значения внутри основго модуля и внутри dll. Далю "финт ушами", вместно LoadLibrary вызываю LoadLibraryEx(DllName,NULL,DONT_RESOLVE_DLL_REFERENCES) - в смысле грузись моя дллька, токль DllMain просьба не выполнять. При этом обращение к функциям типа printf и GetStdHandle - вызывает ошибку времени выполнения (очень где-то глубоко) ребята, бьюсь над этим уже много времени. ПЛИЗ, помогайте |
| Автор: Nastya 4.4.2005, 12:04 |
| Вобще, судя по всему весь вопрос грубо говоря сводится к выяснению следующих деталей 1. Где/когда/кем ведется заполненение массиво _iob ( т.е. определения значений переменных stdin,stdout,stderr) 2. И что же такое деллает загрузчик при условии, что фуекция DllMain У меня пустая (ведь делает что-то стервец |
| Автор: Sun 4.4.2005, 12:18 | ||
Нашел подходящую функцию
|
| Автор: Nastya 4.4.2005, 12:25 |
| Sun. солнышко, я нашла это давно, но пока никакой пользе мне это не принисло. Ели я правльно думаю то, смотри: Все потоки можно рассматиривать как файлы: - у файла есть файловы дискриптор int - может быть определена структура FILE* - есть HANDLE (виндузовский) Тк вот все эти функции переопределения потоков, что _dup2, что SetStdHandle, работают с теми же файлами, но каждый своим путем. Причем для получения HANDLA из файлового дискриптора или наоборот (вобщем любого из трех вышеописанных описателей из любого) есть специальные функци. Так что твое предложение из тупика нас пока не вывело. Жду еще |
| Автор: Sun 4.4.2005, 12:50 |
| Хм..Странно однако. Видимо где-то в другом месте идет переопределение вывода. Тогда можно попробовать сделать перехват для CreateFile и если будет идти создание "CONOUT$" файла - делать подмену файловго дескриптора. Или сделать перехват для SetStdHandle, так как похоже его кто-то вызывает. |
| Автор: Nastya 4.4.2005, 13:19 | ||
Как ты себе это представляешь? Вся проблема в том, что желательно dll не трогать. Т.е. все делается в основном модуле. dll и знать не должна куда она выводит |
| Автор: Sun 4.4.2005, 13:46 | ||||
Если предположение что в Dll идет перенаправление вывода верно, то нужно перехватить это перенаправление, установив ловушки для вызова функций SetStdHandle и CreateFile. Тогда если в Dll будет идти попытка перенаправления вывода, мы будем это перехватывать и подменять файловый дескриптор на тот который нам нужен. Что-то вроде такого
|
| Автор: Nastya 4.4.2005, 13:51 |
| Ой, по моему это слишком Кроме того, я не уверена ,что CreateFile в принцепе будет. Может просто инициализироваться массив _iob. Можно попробывать, но как-то такой вариант ТЯЖЕЛОВАТ (в смысле ресурсов) |
| Автор: Nastya 4.4.2005, 16:29 | ||
Вот код, уже с pipe, не обошлось без помощи ребят с форума rsdn.ru
Из hPipe потом читаем |
| Автор: Sun 4.4.2005, 17:02 | ||
Но проблема и дальше не решена? Вывод в Dll дальше не перехватывается? |
| Автор: Nastya 5.4.2005, 08:29 |
| Почему, все запускаемы мной dll-ки пишут в мой pipe. Причем не имеет значение как организован вывод в sttdout при помощи printf, puts или cout<< |
| Автор: alrond 27.7.2006, 17:04 | ||||
| Привет! вынежден поднять эту тему У меня та же задача, что надо все из dll перенаправлять в мой файл и обрабатывать... Но не могу подключить код, который Nastya реализовала
вот сюда
dll получает из командной строки опции и работая выдает результаты на консоль... хочется из консоли перенаправить в exe через пайп...помогите!!! Как вставить вышеназванное решение? весь интернет перерыл, нашел только здесь и здесь http://www.rsdn.ru/forum/Message.aspx?mid=13172 да и то, не полные коды... Есть много примеров с пайпами, но для варианта старта сторонней программы, а не dll Пример: http://www.codenet.ru/progr/bcb/pipes.php (исходники dll-ки есть, но все исправить нереально, слишком много кода) |
| Автор: alrond 1.8.2006, 15:11 | ||
| Привет! вставил я код, компилируется без ошибок, в файл все stdout из dll записываются, но не получается читать из пайпа (или файла). Проверял, все сообщения из этого кода идут в никуда, в файл записываются только stdout из dll Как можно работать в этом случае?
|