有关光驱操作的几个超级大难题!(270分)

  • 主题发起人 主题发起人 lxv
  • 开始时间 开始时间
L

lxv

Unregistered / Unconfirmed
GUEST, unregistred user!
1.如何识别系统光驱数目
2.如何建立一个系统光驱盘符列表
3.如何知道该列表(见2)中指定的光驱是开还是关
4.如何对该列表(见2)中指定的光驱进行打开/关闭操作
5.如何识别光驱类型,特别是如何识别虚拟的或真实的

谁要能回答出来,那可真是超级大天才罗!

由于这里速度超级慢,很难连上,知道答案
记得发Email:stlxv@21cn.com告诉我哟,不胜感激!
 
1.和2.可以一起解决:先用GetLogicalDrives取得系统中可用的盘符,然后用
GetDriveType逐个判断其类型,如是DRIVE_CDROM就是光驱了。
3.和4.可以查大富翁以前的问题,好象有人问过了。
5.目前我还不知道。
 
3和4有,可是或是不完整就是编译时出错。总之就是无法用啦。
 
5比较困难,关注一下
 
打开CDROM门:
mciSendString('Set cdaudio door
open wait', nil, 0, handle);
关闭CDROM门:
mciSendString('Set cdaudio door
closed wait', nil, 0, handle);

---- 为了使用这个函数,记住在单元的USES子句中,一定要包含MMSystem单元。
第五个问题也是我想知道的!
 
我想知道3
我也有一个问题和3类似,到现在还没解决!
 
5:让它打开或关闭,能是真实的,不能的就是虚拟的,不知道是否可以?
 
sorry,I don't know
 
附加功能 将问题提前
 
我只知道一二个问题可以这样解决:

检测是否是CDROM:

Function IsCDROM(Drv : Char):BOOLEAN;
Var
CDR : string;
cnt : byte;
Count,First : word;
begin
Result := false;
CDR := '';
asm
mov ax, 1500h
xor bx, bx
int $2f //CDROM中断
les di, COUNT
mov es:[di], bx
les di, FIRST
mov es:[di], cx
end;
if Count > 0 then
for cnt := 0 to (Count-1) do
CDR := CDR + char(First + Byte('A') + cnt);
Result := (Pos(upcase(Drv),CDR) > 0);
end;

建立光驱的列表你就自己来了。
 
请结束或继续
 
请继续或结束
 
假光驱不能断开和同步数据传输,具体在注册表中就是没有Disconnect和SyncDataXfer选项.
 
请继续或结束
 
关于3,我觉得必须让程序一直运行着,监视某个消息(抱歉不记得什么消息了),这样
才能知道光驱的开关状态,在程序刚刚开始运行的时候没办法直接判断光驱开关状态,但是
可以通过让光驱打开或关闭,设置光驱处于某个开关状态。
 
多人接受答案了。
 
后退
顶部