Mail Archives: djgpp/1998/06/17/10:52:41
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 <stdlib.h>
#include <conio.h>
#include <dpmi.h>
#include <go32.h>
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.
- Raw text -