无忧启动论坛

标题: QBWIN做的程序 在电脑上死机的原因! [打印本页]

作者: xuxuezeng    时间: 2007-7-24 23:01
标题: QBWIN做的程序 在电脑上死机的原因!
天风做的一键恢复程序(同方HPA的哪个)在我的笔记本上运行正常,但是在另一台台式机上一直不能运行,就只有光标在闪,不能运行下去,我还以为是我电脑太老了(奔三的)的原因,后来又在一台同方机子上又碰上了,这个比较新,看来不是这个原因了,后来在一次偶然的机会当中,发现了死机的原因了,原来跟硬盘的分区有关,只要在硬盘上没有FAT分区类型的,也就是全是NTFS格式分区类型的就会死机,后来想一下就会明白了,只要是用QBWIN做的程序,每次运行时,QBWIN就会在硬盘上找一分区来做临时文件,但DOS不认识NTFS文件格式,在全NTFS文件格式下的系统中,QBWIN找不到硬盘分区来做临时文件,就卡在那儿,死机了,后来我在硬盘上划一个FAT分区,就可以运行了,我在两台机器上试验了一下,都是这样,是不是其它机器,都是这样,希望大家提一提!
作者: zqlcchzql    时间: 2007-7-24 23:34
QBWIN会默认在C盘生成4个临时文件,其实这是VGA 12H模式显存4个位面的内存镜像,QBWIN在使用下拉框还有菜单时就会用这文件来保存屏幕上的内容。。。但可以通过修改QBWIN生成的BAS文件来更改这几个临时文件的位置。。。
但还是不够方便,所以就扔了QBWIN。。。
反正DOS下的GUI库很多,WINSAIL,ALLEGO都很不错的说。。
作者: xuxuezeng    时间: 2007-7-26 12:25
原帖由 zqlcchzql 于 2007-7-24 23:34 发表
QBWIN会默认在C盘生成4个临时文件,其实这是VGA 12H模式显存4个位面的内存镜像,QBWIN在使用下拉框还有菜单时就会用这文件来保存屏幕上的内容。。。但可以通过修改QBWIN生成的BAS文件来更改这几个临时文件的位置 ...

请教一下,怎样修改QBWIN生成的BAS文件来更改这几个临时文件的位置?
作者: zqlcchzql    时间: 2007-7-26 12:44
ENEN,我回去翻翻以前做的程序,明天再和你说。
作者: xuxuezeng    时间: 2007-7-26 12:50
原帖由 zqlcchzql 于 2007-7-26 12:44 发表
ENEN,我回去翻翻以前做的程序,明天再和你说。


谢谢,最好能将你以前的老古董贡献出来,让大家都跟你学习一下!
作者: zqlcchzql    时间: 2007-7-27 11:38
新建二个过程,一个名叫SavScr12,是保存屏幕,另一个是ResScr12,是恢复屏幕,原理是写VGA端口,分别保存显存的4个位面,参数1是路径

SUB SavScr12 (SavePath AS STRING, BYVAL Index AS INTEGER)
DIM Loop1 AS LONG
DEF SEG = &HA000

Path$ = RTRIM$(LTRIM$(SavePath))
IF Path$ = "" THEN
   Path$ = "."
END IF
IF RIGHT$(Path$, 1) <> "\" THEN
   Path$ = Path$ + "\"
END IF
                  
FOR Loop1 = 0 TO 3
    OUT &H3CE, 4
    OUT &H3CF, Loop1
    IF Loop1 = 0 THEN
       BSAVE Path$ + "~~QB" + LTRIM$(RTRIM$(STR$(Index))) + ".~~1", 0, 38400
    END IF
    IF Loop1 = 1 THEN
       BSAVE Path$ + "~~QB" + LTRIM$(RTRIM$(STR$(Index))) + ".~~2", 0, 38400
    END IF
    IF Loop1 = 2 THEN
       BSAVE Path$ + "~~QB" + LTRIM$(RTRIM$(STR$(Index))) + ".~~3", 0, 38400
    END IF
    IF Loop1 = 3 THEN
       BSAVE Path$ + "~~QB" + LTRIM$(RTRIM$(STR$(Index))) + ".~~4", 0, 38400
    END IF
NEXT

END SUB

=========================================
SUB ResScr12 (SavePath AS STRING, BYVAL Index AS INTEGER)
DEF SEG = &HA000

Path$ = RTRIM$(LTRIM$(SavePath))
IF Path$ = "" THEN
   Path$ = "."
END IF
IF RIGHT$(Path$, 1) <> "\" THEN
   Path$ = Path$ + "\"
END IF

OUT &H3C4, 2
OUT &H3C5, 1
BLOAD Path$ + "~~QB" + LTRIM$(RTRIM$(STR$(Index))) + ".~~1"
KILL Path$ + "~~QB" + LTRIM$(RTRIM$(STR$(Index))) + ".~~1"

OUT &H3C5, 2
BLOAD Path$ + "~~QB" + LTRIM$(RTRIM$(STR$(Index))) + ".~~2"
KILL Path$ + "~~QB" + LTRIM$(RTRIM$(STR$(Index))) + ".~~2"

OUT &H3C5, 4
BLOAD Path$ + "~~QB" + LTRIM$(RTRIM$(STR$(Index))) + ".~~3"
KILL Path$ + "~~QB" + LTRIM$(RTRIM$(STR$(Index))) + ".~~3"

OUT &H3C5, 8
BLOAD Path$ + "~~QB" + LTRIM$(RTRIM$(STR$(Index))) + ".~~4"
KILL Path$ + "~~QB" + LTRIM$(RTRIM$(STR$(Index))) + ".~~4"

END SUB


==========================
然后查找源文件中的GetTx和PutTx,分别用SavScr12和ResScr12代替。。有VB基础的应该很好看明白

[ 本帖最后由 zqlcchzql 于 2007-7-27 11:40 AM 编辑 ]
作者: xuxuezeng    时间: 2007-7-27 21:01
原帖由 zqlcchzql 于 2007-7-27 11:38 发表
新建二个过程,一个名叫SavScr12,是保存屏幕,另一个是ResScr12,是恢复屏幕,原理是写VGA端口,分别保存显存的4个位面,参数1是路径

SUB SavScr12 (SavePath AS STRING, BYVAL Index AS INTEGER)
DIM Loo ...



非常谢谢,我回去试一下!:victory::victory::victory:
作者: xuxuezeng    时间: 2007-7-27 23:32
SUB SavScr12 (SavePath AS STRING, BYVAL Index AS INTEGER)
请教,最后一个参数INTEGER怎么用呢?能举一个例吗?
作者: zqlcchzql    时间: 2007-7-28 11:48
一般情况下,qbwin中puttx和gettx是成对使用的,比如在显示comcobox在显示下拉框之前会调用gettx来保存屏幕,隐藏下拉框之后再用puttx来恢复屏幕,在这一对中你用
用scrvscr("z:\",1),resscr("z:\",1),这时index是1

那么在另一对puttx和gettxt中1最好就不要再用了。用2就可以了

依引类推
作者: netwinxp    时间: 2007-7-28 12:14
保存一小块画面却用了整个屏幕,不是很理想
作者: xuxuezeng    时间: 2007-7-28 12:22
原帖由 zqlcchzql 于 2007-7-28 11:48 发表
一般情况下,qbwin中puttx和gettx是成对使用的,比如在显示comcobox在显示下拉框之前会调用gettx来保存屏幕,隐藏下拉框之后再用puttx来恢复屏幕,在这一对中你用
用scrvscr("z:\",1),resscr("z:\",1),这时i ...


   假如我用了5对,就是SCRVSCR("Z:\",5)了?
作者: zqlcchzql    时间: 2007-7-28 14:27
每一对数字要不一样就可以了。。。。随便是什么就成。
作者: zqlcchzql    时间: 2007-7-28 16:11
原帖由 netwinxp 于 2007-7-28 12:14 PM 发表
保存一小块画面却用了整个屏幕,不是很理想


其实QBWIN自身的puttx和gettx和我写的过程原理是一样的,也是用BSAVE和BLOAD。。。只不过不能改路径罢了。。。。
效率在使用过程中根本感觉不到慢,因为QBWIN只在下拉列表和菜单中使用了这两个函数,BSAVE和BLOAD的速度是非常快的。
作者: yumu    时间: 2007-7-28 20:36
看来qbwin也不是很好用啊!!
作者: xuxuezeng    时间: 2007-7-28 21:28
我用了你的方法,编译通过了,使用时还是与原来的一样,我是在内存中划分出一个X盘,将路径指到X盘,SCRVSCR "X:\",1 仍然行失败!
作者: netwinxp    时间: 2007-7-28 21:48
用TC的流文件读写方法可以直接写到程序所在的目录。
作者: zqlcchzql    时间: 2007-7-29 11:37
ENEN,我装机虚拟机试试
作者: zqlcchzql    时间: 2007-7-29 12:10
汗,我是老糊涂了。。。。。
对于这个问题只要用内存虚拟盘软件比如XMSDSK生成一个内存盘比如Z:
然后再用十六进制编辑器把生成的EXE文件中的c:替换成z:就可以用了。

那个savscr12和resscr12是为了解决以前一个客户抱怨说怎么C盘生成了一大堆垃圾文件想出来的代替函数。。。
抱歉抱歉
作者: xuxuezeng    时间: 2007-7-29 15:59
原帖由 zqlcchzql 于 2007-7-29 12:10 发表
汗,我是老糊涂了。。。。。
对于这个问题只要用内存虚拟盘软件比如XMSDSK生成一个内存盘比如Z:
然后再用十六进制编辑器把生成的EXE文件中的c:替换成z:就可以用了。

那个savscr12和resscr12是为了解决以前 ...

没关系,没关系,学习么,不怕多的!按你的方法解决了全NTFS死机的问题了,而且不会有垃圾文件!谢谢了!:victory:
作者: xuxuezeng    时间: 2007-7-29 17:57
原帖由 zqlcchzql 于 2007-7-24 23:34 发表
QBWIN会默认在C盘生成4个临时文件,其实这是VGA 12H模式显存4个位面的内存镜像,QBWIN在使用下拉框还有菜单时就会用这文件来保存屏幕上的内容。。。但可以通过修改QBWIN生成的BAS文件来更改这几个临时文件的位置 ...

  这样吧?如果你有时间的话,发一个话题,为大家讲一讲WINSAIL吧?详细的介绍下开发DOS界面程序,大家都想了解一下,但都不懂,当一下老师吧?怎么样?




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3