怎样一次关闭多个光驱?(10分)

嫩手

Unregistered / Unconfirmed
GUEST, unregistred user!
是一次关闭多个光驱,比如有3个或5个,一个事件一次全都关闭!
 
nzfboy问过的一段代码tseug回复的。可以实现多个光驱的打开和关闭,当然需要你自己写循环和判断是否为光驱啦。
uses mmSysTem;
procedure CDRomOpen(bOpenDrive: Boolean;
cDrive: Char);
var
o: MCI_OPEN_PARMS;
status: MCI_STATUS_PARMS;
flags: DWord;
szDriveName: array[0..3] of Char;
begin
szDriveName := '?:';
ZeroMemory(@o, SizeOf(MCI_OPEN_PARMS));
szDriveName[0] := cDrive;
o.lpstrDeviceType := PChar(MCI_DEVTYPE_CD_AUDIO);
o.lpstrElementName := szDriveName;
flags := MCI_OPEN_TYPE or MCI_OPEN_TYPE_ID or MCI_OPEN_ELEMENT or MCI_OPEN_SHAREABLE;
if mciSendCommand(0, MCI_OPEN, flags, Cardinal(@o)) = 0 then
begin
status.dwItem := MCI_STATUS_READY;
if bOpenDrive then
mciSendCommand(o.wDeviceID, MCI_SET, MCI_SET_DOOR_OPEN, 0)
else
mciSendCommand(o.wDeviceID, MCI_SET, MCI_SET_DOOR_CLOSED, 0);
mciSendCommand(o.wDeviceID, MCI_CLOSE, MCI_WAIT, 0);
end;
end
 
意思是:不用输入任何盘符,就点一个按钮就可以关闭多个光驱
 
嗨!你循环一下,大不了就从A到Z嘛,管他是不是光驱,都发送关闭按钮不就可以啦?
还有,试验一下下面这个不区分光驱直接关闭的,大概可以关闭多个,没有试验过,目前没有条件测试。
mciSendString('Set cdaudio do
or open wait', nil, 0, handle);
mciSendString('Set cdaudio do
or closed wait', nil, 0, handle);
 
这个只能关闭第一个光驱,其它无作用
 
function EjectCdrom(open1:Boolean;drives:string):boolean;
var
open:MCI_OPEN_PARMS;
status:MCI_STATUS_PARMS;
flag:word;
ferror:longint;
begin
FillChar(Open, SizeOf(MCI_Open_Parms), 0);
open.lpstrDeviceType:=PCHAR(MCI_DEVTYPE_CD_AUDIO);
open.dwCallback:=0;
OPEN.lpstrElementName:=pchar(drives);
FLAG:=MCI_OPEN_TYPE OR MCI_OPEN_TYPE_ID OR MCI_OPEN_ELEMENT OR MCI_OPEN_SHAREABLE;
if MCISENDCOMMAND(0,MCI_OPEN,FLAG,Longint(@open))=0
then
begin
status.dwItem:=MCI_STATUS_READY;
if open1
then
ferror:=MCISENDCOMMAND(open.wDeviceID,MCI_SET,MCI_SET_DOOR_open,0);
else
ferror:=MCISENDCOMMAND(open.wDeviceID,MCI_SET,MCI_SET_DOOR_closed,0);
ferror:=MCISENDCOMMAND(OPEN.wDeviceID,MCI_CLOSE,MCI_WAIT,0);
end;
end;
然后
for i:=0 to 23 do
EjectCdrom(true,'a'+i)
 
//得到光驱列表
procedure Getcdromlist(var cdromlist:string);
const BufSize = 256;
var
Buffer : PChar;
P : PChar;
i :integer;
s:string;
begin
cdromlist:='';
GetMem(Buffer, BufSize);
try
if GetLogicalDriveStrings(BufSize, Buffer) <> 0 then
begin
P := Buffer;
while P^ <> #0 do
begin
if GetDriveType(p)=5 then
begin
s:=Concat(s,p);
Cdromlist:=Cdromlist+s[1];
s:='';
Fcount:=Fcount+1;
end;
Inc(P, StrLen(P) + 1);
end;
end;
finally
FreeMem(Buffer, BufSize);
end;
for i:=1 to length(cdromlist) do
cdromlist:=upcase(cdromlist);
end;
 
多人接受答案了。
 
顶部