У меня есть 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 (да, у меня есть его источники, но я действительно не хочу их менять) ничего не делает. Бог знает, где делается этот вывод.
Я пробовал:
- Старый добрый
freopen()
трюк. Работал для моей DLL, без эффекта для внешних DLL.
- WinAPI
SetStdHandle()
вызов. Не работает вообще Кажется, есть проблемы с Win7.
AllocConsole()
+ _open_osfhandle()
. То же, что и 1. См. Мой вывод в консоли, не вижу вывод внешнего dll.
cout.rdbuf()
переназначить. То же, что 3, но только для cout.
Ну, ребята, мне действительно нужна помощь. Похоже, я застрял: - /
Дополнительная информация:
Хост-приложение, моя dll и внешняя dll были разработаны с использованием MSVS'05. Все библиотеки имеют настройку «Использовать MFC в статической библиотеке». Тестирование проводилось под Win7 x64. У меня есть ВСЕ источники, но у меня нет разрешения их менять.