Главная страница | назад





Article #17019: STDPRN and STDAUX

 Question and Answer Database

FAQ2019C.txt   STDPRN and STDAUX
Category   :C/C++ Language Issues
Platform    :All
Product    :BC++  5.x

Question:
Why doesn't STDPRN (from STDIO.H) work in my Win32 Console
Program or my EasyWin Program?

Answer:
The stdprn and stdio macros that are defined in STDIO.H will 
only work properly when the program is compiled as a DOS 
executable.
There are two reasons for this :

1) The section that defines those macros is wrapped in two 
important #ifdef's.  The sections dealing with these lines 
are not indented, while the rest of the sections of the header
file are indented.  The ellipsis (...) indicates that a section 
of the header file has been omitted due to it's lack of 
relevance to the current topic.  Following the header section 
is an explanation of each section and it's importance.  
The two important #ifdef's have C++ comments following them to 
point out this fact.


	#if !defined(__FLAT__) 	// first relevant ifdef

	...

	#if !defined( _RTLDLL)   // second relevant ifdef
	extern  FILE    _RTLENTRY _streams[];
	extern  unsigned    _RTLENTRY _nfile;

#define stdin   (&_streams[0])
#define stdout  (&_streams[1])
#define stderr  (&_streams[2])
#define stdaux  (&_streams[3])
#define stdprn  (&_streams[4])

	#else

	#ifdef __cplusplus
	extern "C" {
	#endif
	FILE far * far _RTLENTRY __getStream(int);
	#ifdef __cplusplus
	}
	#endif

#define stdin   __getStream(0)
#define stdout  __getStream(1)
#define stderr  __getStream(2)

	#endif  /* _RTLDLL  */
	...
	#else    /* defined __FLAT__ */  
	...
#define stdin   (&_streams[0])
#define stdout  (&_streams[1])
#define stderr  (&_streams[2])
	...
	#endif  /* __FLAT__ */
	

	Now, for the explanation.  The first relevant ifdef 
is #if !defined(__FLAT__).  The section enclosed by this 
ifdef will ONLY be used if the FLAT memory model is 
not used.  This means that it will only work in 16-bit code, 
because the FLAT memory model only applies to 32-bit programs.  
This means that the section which includes the #defines for 
STDPRN and STDAUX will ONLY occur if __FLAT__ is not defined.  
This is because STDPRN and STDAUX are not clearly defined
in Win32.  A workaround for this would be to do an fopen(lpt1, 
etc etc), or to do a CreateFile

	The second pertinent ifdef is #if !defined( _RTLDLL).  
The section enclosed by this ifdef will ONLY be used if 
_RTLDLL is not defined, which means that you are linking with 
the STATIC version of the Borland Run Time Library.
(RTLDLL is short for DLL version of Run Time Library)  

        The EasyWin framework that allows DOS programs to be
run as 16-bit Windows programs in an inactive window has 
a modification that redirects STDPRN, STDAUX, and STDERR to 
STDOUT.


7/2/98 10:32:32 AM
 

Last Modified: 01-SEP-99