www.pudn.com > cwin.rar > CALLDOS.C
/*-----------------------------------------------------------
程序 Call_DOS : 临时返回DOS提示符状态
-----------------------------------------------------------*/
#include
#include
#include
#include
int _Cdecl call_DOS(envname)
char *envname; /* 应用程序文件名 */
{
int handle; /* 当前屏幕图象在扩充内存中的句柄 */
char **scr; /* 当前屏幕图象在常规内存中的缓冲区指针 */
int ismouselight = ismouselight(); /* 当前鼠标光标状态 */
int pmthandle; /* 提示行图象在扩充内存中的句柄 */
char **pmt; /* 提示行图象在常规内存中的缓冲区指针 */
/*---- 保存当前屏幕图象 -------------------------------*/
if(ismouselight)
delight_mouse();
pmthandle = getblockXMS(0,780-_ScreenTop,79,809-_ScreenTop);
if(pmthandle==0)
pmt = getblock(0,780-_ScreenTop,80,30);
if((handle=getblockXMS(0,0,79,_ScreenHigh-1))==0 && (scr=getblock(0,0,80,_ScreenHigh))==NULL)
return 0;
/*---- 保存显示适配器状态 -----------------------------*/
_ES = FP_SEG(_HanFont);
_BX = FP_OFF(_HanFont);
_AH = 0x1c;
_CX = 7;
_AL = 1;
geninterrupt(0x10);
/*---- 恢复原来的BIOS中断1CH --------------------------*/
setvect(0x1c,_Oldint1CH); /* 恢复原来的BIOS中断1CH */
/*---- 重置鼠标驱动程序 -------------------------------*/
_AX = 0;
geninterrupt(0x33);
/*---- 设置西文字符显示模式 ---------------------------*/
_AH = 0x00;
_AL = 0x03;
geninterrupt(0x10);
/*---- 恢复原来的西文屏幕显示内容 ---------------------*/
_LoadEnv();
/*---- 调用DOS命令处理程序 ----------------------------*/
printf("\nPress EXIT to return %s...\n",envname);
system("");
/*---- 存储西文屏幕信息 -------------------------------*/
_SaveEnv();
/*---- 设置VGA的图形模式12H(640×480×16) -------------*/
_AH = 0x00;
_AL = 0x12;
geninterrupt(0x10);
/*---- 恢复显示适配器状态 -----------------------------*/
_ES = FP_SEG(_HanFont);
_BX = FP_OFF(_HanFont);
_AH = 0x1c;
_CX = 7;
_AL = 2;
geninterrupt(0x10);
/*---- 恢复原屏幕图象 ---------------------------------*/
if(pmthandle)
putblockXMS(0,780-_ScreenTop,79,809-_ScreenTop,pmthandle);
else
putblock(0,780-_ScreenTop,80,30,pmt);
if(handle)
putblockXMS(0,0,79,_ScreenHigh-1,handle);
else
putblock(0,0,80,_ScreenHigh,scr);
/*---- 设置鼠标 ---------------------------------------*/
reset_mouse();
set_mouse_range(0,0,_ScreenWidth*8,_ScreenHigh);
if(ismouselight)
light_mouse();
/*---- 设置新的BIOS中断1CH ----------------------------*/
_Oldint1CH = getvect(0x1c); /* 保存原中断1CH的指针 */
setvect(0x1c,_Newint1CH);
}