How do I eject two CD-Rom drives?

I am using Delphi 5, and I need to know how to eject both CD-ROM drives and also be able to close them using code.

TMediaPlayer has a problem with ejecting 2nd CD-ROM, but I would rather not use the TMediaPlayer anyways.
perkleyAsked:
Who is Participating?
 
DidierDConnect With a Mentor Commented:
at http://members.truepath.com/delphi/tips/tip120_cdromi1.htm
 you can find an example that uses the DeviceId
0
 
andysalihCommented:
this will do the job

Uses MMSystem
    Open CDROM Drive
    mciSendString('Set cdaudio door open', nil, 0, handle);
    Close CDROM Drive
    mciSendString('Set cdaudio door closed', nil, 0, handle);

cheers
Andy
0
 
perkleyAuthor Commented:
No that will not do the job.  I want the second CD-ROM to open and I don't know how to get the correct handle to do so.  That code is posted everywhere, I already knew about that, but I cannot get the second drive to open.
0
Free Tool: IP Lookup

Get more info about an IP address or domain name, such as organization, abuse contacts and geolocation.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
perkleyAuthor Commented:
Hey also if someone knows, is it possible to open a CD-ROM drive through the network?  So in other words, if I had someone else's CD-ROM mapped as J: on my machine then I could open it on their machine running software on my machine.
0
 
andysalihCommented:
well excuse me for trying to help, get on with it then

regards
andy
0
 
perkleyAuthor Commented:
andysalih, don't take my response wrong.  I was not upset, it's just that a lot of people don't seem to read the question very well lately.  It is like everyone just wants to be the first accepted and they don't really understand what the problem is.

This is what I have found:

const // for the MCI calls
 CD_OPEN      = 'open cdaudio!%s: shareable';
 CD_OPENDOOR  = 'set %s: door open';
 CD_CLOSEDOOR = 'set %s: door closed';

var {Global Variables}
    err           : integer;
    returnString  : array[0..4095] of Char;
    TheDrive      : char; // (a,b,c,d,e.....)

// Function to grant access to the drive
function TForm1.OpenCDMedia():boolean;
begin
 err := mciSendString(pchar(format(CD_OPEN,[TheDrive])),
                      returnString,sizeOf(returnString),
                      handle);
 if err = 0 then
   result := true
 else begin
   MessageDlg('Error', mtWarning, [mbYes], 0);
   result := false;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
    TheDrive := 'F';
    OpenCDMedia;

    // To open the door
    err := mciSendString(pchar(format(CD_OPENDOOR,
                      [TheDrive])),
                      returnString,sizeOf(returnString),
                      handle);

    // to close the door
    err := mciSendString(pchar(format(CD_CLOSEDOOR,
                      [TheDrive])),
                      returnString,sizeOf(returnString),
                      handle);
end;
0
 
andysalihCommented:
okey , well im not going to read your code but will this do for you

function GetCD_ID(WhichDrive: string): string;
var
  VolumeName    : array[0..255] of char;
  FileSystemType   : array[0..255] of char;
  SerialNum    : DWORD;
  MaxFilenameLength   : DWORD;
  Flags     : DWORD;
begin
  if (GetVolumeInformation(PChar(WhichDrive),
                           VolumeName,
                           256,
                           @SerialNum,
                           MaxFilenameLength,
                           Flags,
                           FileSystemType,
                           256)) then
  Result := (IntToHex(SerialNum shr 16, 3) +
             IntToHex((SerialNum shl 16) shr 16, 4));
end;

function GetCD_Label(WhichDrive: string): string;
var
  VolumeName    : array[0..255] of char;
  FileSystemType   : array[0..255] of char;
  SerialNum    : DWORD;
  MaxFilenameLength   : DWORD;
  Flags     : DWORD;
begin
  Result := 'No CD Present';
  if (GetVolumeInformation(PChar(WhichDrive),
                           VolumeName,
                           256,
                           @SerialNum,
                           MaxFilenameLength,
                           Flags,
                           FileSystemType,
                           256)) then
  Result := VolumeName;
end;

function FindFirstCDROM: shortstring;
var
  AList                         : TStringList;
  Counter                       : integer;
begin
  Result := 'no CDROM present';
  AList := TStringList.Create;
  ListDrives(AList);
  for Counter := 0 to AList.Count-1 do
    if GetDriveType(PChar(Alist.Strings[Counter])) = DRIVE_CDROM then
      Result := Alist.Strings[Counter]
end;

procedure ListDrives(Strings: TStringList);
const BufSize = 256;
var
  Buffer                    : PChar;
  P                            : PChar;
begin
  GetMem(Buffer, BufSize);
  try
    Strings.BeginUpdate;
    try
      Strings.Clear;
      if GetLogicalDriveStrings(BufSize, Buffer) <> 0 then begin
        P := Buffer;
        while P^ <> #0 do begin
          Strings.Add(P);
          Inc(P, StrLen(P) + 1);
        end;
      end;
    finally
      Strings.EndUpdate;
    end;
  finally
    FreeMem(Buffer, BufSize);
  end;
end;

andy
0
 
perkleyAuthor Commented:
Your example actually seems to be better than what I found.  Anyway thanks for the excellent answer.
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.