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); 
    }