Как перенаправить std :: clog в другую библиотеку CRT? - PullRequest
0 голосов
/ 11 мая 2011

У меня есть программа Win32, которая построена на VS2008, поэтому мой код связан с MSVCR90.DLL и MSVCP90.DLL. Однако он также выполняет код в DLL (которую я не могу изменить), созданной с помощью VS2005, и когда код в этой DLL печатается в поток засорения, он делает это через MSVCR80.DLL и MSVCP80.DLL. Вот проблема: если я перенаправлю std :: clog в своем коде, я затрону только код, построенный на библиотеках crt 9.0, код, использующий более старую версию crt 8.0, не будет перенаправлен. Так есть ли способ перенаправить поток засорения в DLL, построенной на более старой CRT?

Я исследовал вызовы GetModuleHandle () и GetProcAddress () в старых библиотеках CRT и сумел перенаправить поток C stderr (через _open_osfhandle и _dup2), однако поток C ++ по-прежнему остается незатронутым. Я думаю, что мне также нужно вызвать ios_base :: sync_with_stdio () в более старой библиотеке CRT, но я не смог получить действительный адрес для этой функции. Любая помощь будет принята с благодарностью.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 11 мая 2011

Попробуйте также freopen ... но это также может потребоваться вызвать в старом ЭЛТ.Однако предложение Эрика о вспомогательной DLL является огромным излишним, просто используйте GetProcAddress, чтобы получить указатель на версию VC8.

Наиболее эффективный вариант - перенаправить стандартные потоки при первом запуске процесса.

Другая возможность - отложить загрузку вспомогательной DLL и выполнить перенаправление потока перед загрузкой.Таким образом, когда MSVCRT80 загружается, он подключается к перенаправленному потоку.

0 голосов
/ 11 мая 2011

Сборка вспомогательной DLL с использованием VS2005 - эта DLL должна просто экспортировать некоторые функции, чтобы выполнить настройку, необходимую для работы VS8.

...