![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
Такая ситуация, надо перенаправить поток stdout, так что бы при использовании функций printf, puts и т.д. все выводимые данные выводились в мое окно (а конкретно в RichEdit на нем).
При этом это должно происходить не только в моем модуле, но и во всех загружаемых моим модулях dll-ках. Т.е есть все printf -ы в моей программе со всеми вызываемыми ею примочками должны итди в мое окно. О как!!!! Кто поможет? -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Sun |
|
|||
|
Account removed ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1611 Регистрация: 14.8.2002 Репутация: нет Всего: 48 |
Самое простое решение - перенаправить вывод в пайп.
Дальше используя файловый дескриптор out читать из него данные. -------------------- Account removed |
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
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 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
Вобще, судя по всему весь вопрос грубо говоря сводится к выяснению следующих деталей
1. Где/когда/кем ведется заполненение массиво _iob ( т.е. определения значений переменных stdin,stdout,stderr) 2. И что же такое деллает загрузчик при условии, что фуекция DllMain У меня пустая (ведь делает что-то стервец -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Sun |
|
|||
|
Account removed ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1611 Регистрация: 14.8.2002 Репутация: нет Всего: 48 |
Нашел подходящую функцию
-------------------- Account removed |
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
Sun. солнышко, я нашла это давно, но пока никакой пользе мне это не принисло.
Ели я правльно думаю то, смотри: Все потоки можно рассматиривать как файлы: - у файла есть файловы дискриптор int - может быть определена структура FILE* - есть HANDLE (виндузовский) Тк вот все эти функции переопределения потоков, что _dup2, что SetStdHandle, работают с теми же файлами, но каждый своим путем. Причем для получения HANDLA из файлового дискриптора или наоборот (вобщем любого из трех вышеописанных описателей из любого) есть специальные функци. Так что твое предложение из тупика нас пока не вывело. Жду еще -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Sun |
|
|||
|
Account removed ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1611 Регистрация: 14.8.2002 Репутация: нет Всего: 48 |
Хм..Странно однако. Видимо где-то в другом месте идет переопределение вывода. Тогда можно попробовать сделать перехват для CreateFile и если будет идти создание "CONOUT$" файла - делать подмену файловго дескриптора. Или сделать перехват для SetStdHandle, так как похоже его кто-то вызывает.
-------------------- Account removed |
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
Как ты себе это представляешь? Вся проблема в том, что желательно dll не трогать. Т.е. все делается в основном модуле. dll и знать не должна куда она выводит -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Sun |
|
||||
|
Account removed ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1611 Регистрация: 14.8.2002 Репутация: нет Всего: 48 |
Если предположение что в Dll идет перенаправление вывода верно, то нужно перехватить это перенаправление, установив ловушки для вызова функций SetStdHandle и CreateFile. Тогда если в Dll будет идти попытка перенаправления вывода, мы будем это перехватывать и подменять файловый дескриптор на тот который нам нужен. Что-то вроде такого
-------------------- Account removed |
||||
|
|||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
Ой, по моему это слишком
Кроме того, я не уверена ,что CreateFile в принцепе будет. Может просто инициализироваться массив _iob. Можно попробывать, но как-то такой вариант ТЯЖЕЛОВАТ (в смысле ресурсов) -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
Вот код, уже с pipe, не обошлось без помощи ребят с форума rsdn.ru
Из hPipe потом читаем -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| Sun |
|
|||
|
Account removed ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 1611 Регистрация: 14.8.2002 Репутация: нет Всего: 48 |
Но проблема и дальше не решена? Вывод в Dll дальше не перехватывается? -------------------- Account removed |
|||
|
||||
| Nastya |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 1287 Регистрация: 27.3.2002 Где: Мариуполь Репутация: 3 Всего: 44 |
Почему, все запускаемы мной dll-ки пишут в мой pipe.
Причем не имеет значение как организован вывод в sttdout при помощи printf, puts или cout<< -------------------- Что бы понять рекурсию, надо понять рекурсию "Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор |
|||
|
||||
| alrond |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 27.7.2006 Репутация: нет Всего: 6 |
Привет!
вынежден поднять эту тему У меня та же задача, что надо все из dll перенаправлять в мой файл и обрабатывать... Но не могу подключить код, который Nastya реализовала
вот сюда
dll получает из командной строки опции и работая выдает результаты на консоль... хочется из консоли перенаправить в exe через пайп...помогите!!! Как вставить вышеназванное решение? весь интернет перерыл, нашел только здесь и здесь http://www.rsdn.ru/forum/Message.aspx?mid=13172 да и то, не полные коды... Есть много примеров с пайпами, но для варианта старта сторонней программы, а не dll Пример: http://www.codenet.ru/progr/bcb/pipes.php (исходники dll-ки есть, но все исправить нереально, слишком много кода) |
||||
|
|||||
| alrond |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 33 Регистрация: 27.7.2006 Репутация: нет Всего: 6 |
Привет!
вставил я код, компилируется без ошибок, в файл все stdout из dll записываются, но не получается читать из пайпа (или файла). Проверял, все сообщения из этого кода идут в никуда, в файл записываются только stdout из dll Как можно работать в этом случае?
|
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |