中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-15 04:38
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行
DOS开发编程 & 发展交流 (开发室) » DOS下如何编程来判断光驱已经装入?
可打印版本  7,784 / 45
第1楼 wqqqing 发表于 2003-01-29 00:00
初级用户 发帖 7 积分 119
DOS下如何编程来判断光驱已经装入?
如何在DOS下编写C或者汇编程序来判断光驱是否已经装入?
请高手指点,给个程序段落看看。
谢谢!!!
第2楼 Wengier 发表于 2003-01-29 00:00
系统支持 发帖 10,521 积分 27,736
好主意。
第3楼 qzxym 发表于 2003-01-30 00:00
中级用户 发帖 39 积分 210
简单极了,BASIC语言就能做到,原理就是判断Mscdex.exe是否已经运行即可。
第4楼 nre 发表于 2003-01-30 00:00
银牌会员 发帖 361 积分 1,210
以下是引用qzxym在2003-1-30 22:40:16的发言:
简单极了,BASIC语言就能做到,原理就是判断Mscdex.exe是否已经运行即可。

说这种话有什么意义。 具体怎么实现?
第5楼 Wengier 发表于 2003-01-30 00:00
系统支持 发帖 10,521 积分 27,736
光判断MSCDEX是否加载了没用,而且还有其它的光驱扩展驱动程序,如SHSUCD等。
第6楼 Wengier 发表于 2003-01-31 00:00
系统支持 发帖 10,521 积分 27,736
刚才我对baobolz原来提到的那个FINDRAMD的源代码进行了一番改编,改编成为了FINDCD程序,可以查找光盘所在的盘符,并设置到环境变量CDROM中。它有两个明显的优点:

1:完全支持CLOAKING+MSCDEX,而网上的那个FINDCD.COM 1.02则不支持;
2:可以直接将光盘盘符设到变量CDROM中,操作非常方便,而不用判断任何ERRORLEVEL值。

我已将它传到论坛上来了,下载地址:
打开附件 链接已失效(管理员注 2009-4-28)

第7楼 MYS 发表于 2003-02-06 00:00
元老会员 发帖 1,637 积分 5,170 来自 广东佛山
非常好非常好,这样做启动盘就很方便了。
第8楼 Wengier 发表于 2003-02-06 00:00
系统支持 发帖 10,521 积分 27,736
我又对FINDCD做了一些增强,再次传上来:

打开附件 链接已失效(管理员注 2009-4-28)

注:它还修正了无光驱时会死机的BUG。


第9楼 nre 发表于 2003-02-07 00:00
银牌会员 发帖 361 积分 1,210
~
同时上传原代码吧,有利于大家水平的提高。
第10楼 Wengier 发表于 2003-02-07 00:00
系统支持 发帖 10,521 积分 27,736
好吧,以下是此程序的部分源代码:

程序初始化部分(PASCAL源代码):

program findcd;
const
env: arrayof Char='CDROM=c:'; <- 准备环境变量
var
drvs: array of Char; <- 光驱字符列表
envp: PChar;

查找光驱子程序(汇编源代码):

procedure setdrv; assembler;
asm mov bx,0
mov ax,1500h
int 2fh <- 调用中断取得光驱状态
cmp bx,1 <- 检查光驱是否安装
jc @@m <- 若无,退出子程序
push bx
push ds
pop es
mov bx,offset drvs
mov ax,150Dh
int 2Fh
pop cx
@@l: add byte ptr ,'A'
inc bx
loop @@l
mov byte ptr ,0
@@m:
end;

添加环境变量子程序(汇编源代码,略);

主调用程序(PASCAL源代码):
begin
setdrv; <- 调用查找光驱子程序;
if ord(drvs)=0 then <- 若无光驱,显示“No CD-ROM found”;
WriteLn('No CD-ROM found.'
else begin
env:=drvs; <- 若存在光驱,将第一个光驱字母加入环境变量CDROM;
WriteLn(env); <- 在屏幕上显示“CDROM=x:”;
if not InsertEnvVar <- 调用添加环境变量子程序;
then WriteLn('Cannot set environment variable!'; <- 若无法加入环境变量,显示错误;
exit;
end;
end. <- 程序结束。
第11楼 pfox 发表于 2003-02-07 00:00
银牌会员 发帖 446 积分 1,451
是否支持双光驱及三光驱?
第12楼 Wengier 发表于 2003-02-08 00:00
系统支持 发帖 10,521 积分 27,736
pfox:好主意,因此我刚才对FINDCD又进行了一番增强,在此下载:
打开附件 链接已失效(管理员注 2009-4-28)

此版本的特点是,“FINDCD n”(n是数字)将把CDROM环境变量设置为第n个光驱。若未指定n,则默认为第一个光驱(即n=1)。若n的值为0或非数字,则将CDROM值设置为光驱的数目。

假设现有E:、F:、G:盘三个光驱,那么运行“FINDCD”或“FINDCD 1”将得到“CDROM=E:”,运行“FINDCD 3”将得到“CDROM=G:”;若运行“FINDCD 0”将得到“CDROM=3”(即有三个光驱);若运行“FINDCD 4”将显示光驱找不到(因为只有三个光驱)。


第13楼 pfox 发表于 2003-02-08 00:00
银牌会员 发帖 446 积分 1,451
Good!

Wengier,能否再增强一下,在不加参数运行FindCD后,
直接将第一个CDROM的盘符赋给CDROM环境变量,若存在
第二个、第三个CDROM盘符直接赋给CDROM1、CDROM2?
这样在启动盘里面就可以直接用cda.exe判断光驱里面是否
有盘及是否有存在的文件,若有就可以直接执行或调用。






第14楼 Wengier 发表于 2003-02-15 00:00
系统支持 发帖 10,521 积分 27,736
不如编写个批处理文件来做到,因为若运行FINDCD 0后%CDROM%的值为光驱数目,做个批处理循环并根据光驱数目将所有的光驱字符设置到%CDROM%变量中就可以了。
第15楼 Wengier 发表于 2003-02-15 00:00
系统支持 发帖 10,521 积分 27,736
我刚才编写了个简单的DOS批处理文件,可以通过上面的FINDCD程序方便地将CDROM1,CDROM2等依次设置为光驱盘符.程序如下:
@echo off
set n=0
:loop
set cdrom=
findcd %n% (即: 调用上面的FINDCD)
if %n%==0 set cdn=%cdrom%
if not %n%==0 set cdrom%n%=%cdrom%
if %n%#==%cdn%# goto end
count n (即: n=n+1)
goto loop
:end
set n=
set cdn=
set cdrom=
echo.
1 2 3 4  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023