Перенаправление вывода консоли c ++ dll, используемого в приложении MFC GUI - PullRequest
4 голосов
/ 09 декабря 2010

У меня есть C ++ dll, сообщающий много полезной информации через консольный вывод, используя printf или cout. Я связываю эту dll с моим GUI-приложением, написанным на MFC, и хочу получить доступ к его выводу.

Звучит довольно просто, да? Что ж, я был удивлен, когда после нескольких часов поиска в Интернете и реализации нескольких решений ни одно из них не сработало!

Так что, возможно, нужна дополнительная информация о приложении. У меня огромное хост-приложение, к которому у меня нет доступа. На самом деле, я пишу плагин к нему. Он связывает мой плагин DLL во время выполнения (я полагаю, с помощью LoadLibrary ()). Моя dll в свою очередь использует внешнюю dll, вывод которой я хочу получить. Эта dll связана со мной статически через соответствующий файл lib, поэтому CRT выполняет всю загрузку.

Насколько я знаю, любое приложение (включая все загруженные каким-либо образом DLL) имеет один поток stdout (один stdin и один stderr). И вот тогда все идет слишком сложно для меня. Я попытался перенаправить этот поток stdout (очевидно, для всего приложения / процесса), и в некоторых случаях он работал для моей DLL, но он все еще не работает для внешней библиотеки DLL. То есть если я использую что-то вроде cout << "Hey!"; из моей библиотеки DLL, я могу увидеть это в файле, в который я перенаправил поток. Тем не менее, тот же самый вызов изнутри внешнего dll (да, у меня есть его источники, но я действительно не хочу их менять) ничего не делает. Бог знает, где делается этот вывод.

Я пробовал:

  1. Старый добрый freopen() трюк. Работал для моей DLL, без эффекта для внешних DLL.
  2. WinAPI SetStdHandle() вызов. Не работает вообще Кажется, есть проблемы с Win7.
  3. AllocConsole() + _open_osfhandle(). То же, что и 1. См. Мой вывод в консоли, не вижу вывод внешнего dll.
  4. cout.rdbuf() переназначить. То же, что 3, но только для cout.

Ну, ребята, мне действительно нужна помощь. Похоже, я застрял: - /

Дополнительная информация:
Хост-приложение, моя dll и внешняя dll были разработаны с использованием MSVS'05. Все библиотеки имеют настройку «Использовать MFC в статической библиотеке». Тестирование проводилось под Win7 x64. У меня есть ВСЕ источники, но у меня нет разрешения их менять.

Ответы [ 2 ]

1 голос
/ 09 декабря 2010

Вы облажались из-за настройки «Использовать MFC в статической библиотеке» IIRC. Установка / повторное открытие дескрипторов int (стиль POSIX) не будет работать, потому что и ваша DLL, и ваше приложение используют разные / отдельные библиотеки времени выполнения. Решение: используйте параметр «Использовать MFC в общей библиотеке DLL» . Использование статических библиотек времени выполнения в Windows задерживается именно из-за проблем такого типа.

0 голосов
/ 09 декабря 2010

Вы пробовали _dup2 ? Пример в документах MSDN показывает, как перенаправить stdout. (Я не знаю, работает ли это на уровне библиотеки или на уровне ОС в Windows, поэтому может не работать для всего процесса.)

Конечно, DLL может записывать и в stderr.

...