[Solved][C++] Перенаправление консольного вывода из dll.

Serpent555

Есть написанная на C++ библиотека. Она что-то выводит в консоль. Я ее подключаю к написанному на MFC приложению и хочу иметь доступ к этому выводу. Странно, но у меня никак не получается это сделать. Подробности на stackoverflow.

apl13

А она точно в консоль выводит?

okis

Как именно она выводит в консоль? Если через WriteConsole, то оно в файл не перенаправится ни в каком виде.

Serpent555

Не знаю насчет всей dll, но там точно есть хотя бы несколько выводов через cout, которые я не вижу.

fufa58

а оно не в stderr всё выводит, не?

elenangel

попробуй вызвать в основном коде программы функцию создания консоли BOOL WINAPI AllocConsole(void);
по идее после этого рядом с твоей прогой откроется черное окно и туда должен будет пойти весь output.

Maurog

я так понял:
есть черный ящик host_app.exe
к нему вы написали длл1, которая тянет через delayLoad другую длл2
в длл1 вы смогли заредиректить stdout и cout в ней перехватываются
а что вы сделали во второй длл?
вы там пробовали сделать перехват stdout ?

Serpent555

попробуй вызвать в основном коде программы функцию создания консоли BOOL WINAPI AllocConsole(void);
по идее после этого рядом с твоей прогой откроется черное окно и туда должен будет пойти весь output.
Не стесняйтесь пройти по ссылке. Я же написал, я это пробовал. Окно действительно появилось, но вывода там никакого не оказалось...

Serpent555

я так понял:
есть черный ящик host_app.exe
к нему вы написали длл1, которая тянет через delayLoad другую длл2
в длл1 вы смогли заредиректить stdout и cout в ней перехватываются
а что вы сделали во второй длл?
вы там пробовали сделать перехват stdout ?
Не совсем. host_app.exe тянет через delayLoad длл1, которая статически тянет длл2. Во второй длл не делал ничего, т.к. не имею к ней доступа. Но потоки, если я не ошибаюсь, должны быть едины для всего приложения и загруженных модулей в частности.

Maurog

Но потоки, если я не ошибаюсь, должны быть едины для всего приложения и загруженных модулей в частности.
я не уверен в этом
вот из гугла: http://objectmix.com/smalltalk/182835-how-catch-stdout-exter...
может, вам пригодится

Serpent555

Вот этот ответ на stackoverflow разъясняет ситуацию. Проблема в том, что в обеих библиотеках стоит опция "Use MFC in a Static Library", а потоки являются частью MFC, что приводит к тому, что они фактически разные для этих библиотек. Если поставить "Use MFC in a Shared dll", все работает. Проблема только в том, что я не могу изменить эту опцию для другой библиотеки! Так что вопрос пока открыт.

Dasar

>Проблема только в том, что я не могу изменить эту опцию для другой библиотеки! Так что вопрос пока открыт.
а что нибудь с другой библиотекой делать можешь?
можешь, например, свой код добавить?

Serpent555

Частично. Полная цепочка зависимостей выглядит так:
host_app.exe <- plugin.dll <- our_logic.dll <- vendor.dll
Если в our_logic.dll я еще могу что-то поправить, то в vendor.dll уж точно ничего. А из нее выводятся сообщения об ошибках. И вот до них-то я пока никак не смог добраться, независимо от настроек CRT и MFC.

Maurog

А из нее выводятся сообщения об ошибках
могу посоветовать вытащить логику в отдельный процесс. его аутпут можно зацепить

Serpent555

могу посоветовать вытащить логику в отдельный процесс. его аутпут можно зацепить
Да, вероятно, будет работать. Хотя понятно, что не хотелось бы прибегать к таким ухищренияем.
Решение пришло неожиданно: смог отыскать в vendor.dll интерфейсные функции переопределения потоков :)
Так что можно считать, что проблема закрыта. Всем спасибо.

Maurog

смог отыскать в vendor.dll интерфейсные функции переопределения потоков
прокачанные чуваки написали :shocked:
Оставить комментарий
Имя или ник:
Комментарий: