Re: redirecting cout - is it possible with dynamically loaded DLL?
On Tue, 17 Jul 2007 02:09:28 -0700, johan.de.taeye@gmail.com wrote:
Folks,
I am redirecting the standard output from my console application to a
log file.
Dynamically loaded DLLs seem not the see this redirection, and still
echo on the console.
If possible, link all the modules to the same CRT DLL, i.e. compile all
modules with /MD or /MDd (the IDE calls these the "Multithreaded DLL" and
"Multithreaded Debug DLL" in its option page for setting the "Runtime
Library"). Otherwise, they will have independent CRT state.
Here is the sequence of events in more detail:
1) Starting console application from the command prompt.
2) The application loads a shared library using the "LoadLibraryEx"
function.
The library is loaded and correctly executes an initialization
routine.
3) The console application now redirects cout to a new file.
The (simplified) code used to achieve this is as follows:
log.open(x.c_str(), ios::out);
cout.rdbuf(log.rdbuf());
4) Logging statements in the main application (coded with "cout <<")
write to the new file, as expected.
Logging statements in the shared library (also coded with "cout
<<") continue to be logged to the console, which is not what I want.
Switching the order of steps 2 and 3 doesn't change the behavior.
Sounds like they have different cout objects, because they are linking to
different CRTs.
The code does work fine when running under Linux.
Linux (and Unix in general) has a very different dynamic linking model than
Windows; roughly speaking, the former tries to emulate static linking by
default, while the latter is more like loosely joining together a set of
black boxes that expose only what they explicitly export.
Is the above behavior expected? Or, am I missing something? Any
solutions or alternatives?
If you can't link them all to the same CRT DLL, you will have to mess
around with the Windows-level standard handles. Things can still get out of
sync, though, since the separate couts have separate buffers, so you may
have to flush them manually.
--
Doug Harrison
Visual C++ MVP