四个CDROM的门怎么开?高手救命!!!!!(100分)

  • 主题发起人 主题发起人 Kankan
  • 开始时间 开始时间
K

Kankan

Unregistered / Unconfirmed
GUEST, unregistred user!
我有的四个CDROM,MEDIAPLAYER总是和第一个亲热,
如何能分别打开它们的DOOR?(EJECT)



我很难连上来,请大侠们给我个信。让我早日睡个觉。
shang@990.net
 
如果你有MAIL通知,会把答案寄你的
告诉大家,这个没用,他试过了:
function IsDriveCD(Drive : char) : longbool;


var

DrivePath : string;


begin


DrivePath := Drive + ':/';


result := LongBool(GetDriveType(PChar(DrivePath)) and DRIVE_CDROM);


end;





function EjectCD(Drive : char) : bool;


var

mp : TMediaPlayer;


begin


result := false;


Application.ProcessMessages;


if not IsDriveCD(Drive) then
exit;


mp := TMediaPlayer.Create(nil);


mp.Visible := false;


mp.Parent := Application.MainForm;


mp.Shareable := true;


mp.DeviceType := dtCDAudio;


mp.FileName := Drive + ':';


mp.Open;


Application.ProcessMessages;


mp.Eject;


Application.ProcessMessages;


mp.Close;


Application.ProcessMessages;


mp.free;


result := true;


end;


 
试试用mcisendcommand打开设备时(MCI_OPEN) flag中包含MCI_OPEN_ELEMENT
标志并且指定MCI_OPEN_PARAMS结构中的lpstrDeviceType为nil,
lpstrElementName为要打开的光驱路径. 并用返回的deviceID去弹开特定
的光驱.
 
好象他说也没用,我让他用MCISENDSTRING的
 
那么恶劣点的办法, 取得第一个光驱的deviceID, 然后+1作为第二个光驱的
deviceID.....以次类推
 
各位老兄,我苦战一夜,终于搞定。现在程序还不是太稳定。10拿9稳的样子。
需要指出,不可能用ID+1的方法找到下一个设备。因为ID是OPEN时才产生的。
彼此间没有依赖关系。稍候我来把程序搞定。这个100分就送给我自己了。斑
主给我加200分我公布源程序。:-) 。
谢谢。


侃侃 shang@990.net
 
参见以下程序:
 
对不起,没来得及改,我贴一下:
procedure TCDEvents.GetAllCDDrives;
var
Buffer : array[0..500] of char;
TmpPC : PChar;

begin

GetLogicalDriveStrings(SizeOf(Buffer),Buffer);
TmpPC := Buffer;
fCDDrives.Clear;
fCDDrives.begin
Update;
try
while TmpPC[0] <> #0do
begin

if GetDriveType(TmpPC) = Drive_CDROM then
fCDDrives.Add(TmpPC);
TmpPC := StrEnd(TmpPC)+1;
end;

finally
fCDDrives.EndUpdate;
end;

end;


function TCDEvents.GetXCDDriveLetter(vCDNumber: integer):Shortstring;
begin

Result := cNoCDDrive;
if (fCDDrives.Count > -1) and (fCDDrives.Count >= vCDNumber) then
begin

Result := fCDDrives[vCDNumber];
end;

end;


function TCDEvents.GetFirstCDDriveLetter: Shortstring;
begin

Result := GetXCDDriveLetter(0);
end;


constructor TCDEvents.Create(AOwner: TComponent);
begin

inherited Create(AOwner);
FWindowHandle := AllocateHWnd(WndProc);
fOptions := TCDOptions.Create;
fEnabled := True;
fNotifyMode := nmEvent;
fID := 0;
fCDDrives := TStringList.Create;
GetAllCDDrives;
end;

function TCDEvents.GetFirstDriveLetter(unitmask : longint):char;
var DriveLetter : shortint;
begin

DriveLetter := Ord('A');
while (unitmask and 1)=0 do
begin

unitmask := unitmask shr 1;
inc(DriveLetter);
end;

Result := Char(DriveLetter);
end;

function TCDEvents.GetDevice : word;
var OpenParms : TMCI_Open_Parms;
FID : Word;
begin

if not (csDesigning in ComponentState) then
begin

if fID=0 then
begin

FFlags := 0;
FFlags := mci_notify or mci_open_type or mci_open_shareable;
OpenParms.lpstrDeviceType := 'CDAudio';
OpenParms.dwCallback := 0;
fErrCode := mciSendCommand(0, mci_open, FFlags, Longint(@OpenParms));
if FErrCode = 0 then
{device successfully opened}
begin

fID := OpenParms.wDeviceID;
end;

end;

Result := fID;
end;

end;

procedure TCDEvents.OpenDoor;
var
SetParms: TMCI_Set_Parms;
begin

FFlags := 0;
FFlags := mci_notify or mci_set_door_open;
SetParms.dwCallback := 0;
fErrCode := mciSendCommand(GetDevice, mci_Set, FFlags, Longint(@SetParms));
end;


procedure TCDEvents.CloseDoor;
var
SetParm: TMCI_Set_Parms;
begin

FFlags := 0;
FFlags := mci_notify or mci_set_door_closed;
SetParm.dwCallback := 0;
fErrCode := mciSendCommand( GetDevice, mci_Set, FFlags, Longint(@SetParm) );
end;
 
多人接受答案了。
 
能否检测光驱状态,不管里面有盘无盘,实现一个switch程序?
 
后退
顶部