Date: Wed, 17 Jun 1998 16:51:29 +0200 (CEST) Message-Id: <199806171451.QAA08532@login-2.eunet.no> From: "Gisle Vanem" To: blp01 AT uow DOT edu DOT au Cc: djgpp AT delorie DOT com Subject: Re: Redirecting output MIME-Version: 1.0 Content-type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit Precedence: bulk On Wed, 17 Jun 1998, Brett Porter wrote: > I'm working on a text based project here which uses text windows on > occasion and shells to other programs. > I was wondering if it is possible to redirect the output of this program > into the window. The window will probably use the "conio.h" functions to > define it, but called programs will ignore this using stdout. Even if the > programs use cprintf, it won't know the calling programs settings will it? If the sub-program writes to stdout (or stderr), then the parent program can trap all text by installing a handler for real-mode interrupt 29h. Allocate a real-mode callback (rmcb) in your program. The RMCB gets called for each character written, so it might be a bit slow (switching back and forth between real/prot mode). If the sub-program is written in Borland and is using conio functions the RMCB might (?) work provided `directvideo' is false. AFAIK, no code needs to be locked, but beware not to use more that 2k(?) of stack in the callback. Here is a snippet of something I once made to accomplish this; -------------------------- cut here ------------------------------ #include #include #include #include static _go32_dpmi_seginfo rm_cb, int29_old; static __dpmi_regs rm_reg; static void int29_isr (void) { putch (rm_reg.h.al); /* print to your conio window etc. */ } void int29_exit (void) { if (rm_cb.pm_offset) { _go32_dpmi_set_real_mode_interrupt_vector (0x29,&int29_old); _go32_dpmi_free_real_mode_callback (&rm_cb); rm_cb.pm_offset = 0; } } void int29_init (void) { _go32_dpmi_get_real_mode_interrupt_vector (0x29,&int29_old); rm_cb.pm_offset = (unsigned long) &int29_isr; if (_go32_dpmi_allocate_real_mode_callback_iret(&rm_cb,&rm_reg) || _go32_dpmi_lock_data(&rm_reg,sizeof(rm_reg))) return; _go32_dpmi_set_real_mode_interrupt_vector (0x29,&rm_cb); atexit (int29_exit); } -------------------------- cut here ------------------------------ Gisle V.