?
Solved

How do I eject two CD-Rom drives?

Posted on 2001-08-03
8
Medium Priority
?
181 Views
Last Modified: 2010-04-06
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.
0
Comment
Question by:perkley
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
8 Comments
 
LVL 3

Expert Comment

by:andysalih
ID: 6350146
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
 

Author Comment

by:perkley
ID: 6350161
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
 

Author Comment

by:perkley
ID: 6350329
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
Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 2

Accepted Solution

by:
DidierD earned 400 total points
ID: 6350472
at http://members.truepath.com/delphi/tips/tip120_cdromi1.htm
 you can find an example that uses the DeviceId
0
 
LVL 3

Expert Comment

by:andysalih
ID: 6350529
well excuse me for trying to help, get on with it then

regards
andy
0
 

Author Comment

by:perkley
ID: 6350582
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
 
LVL 3

Expert Comment

by:andysalih
ID: 6350604
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
 

Author Comment

by:perkley
ID: 6350605
Your example actually seems to be better than what I found.  Anyway thanks for the excellent answer.
0

Featured Post

Technology Partners: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The uses clause is one of those things that just tends to grow and grow. Most of the time this is in the main form, as it's from this form that all others are called. If you have a big application (including many forms), the uses clause in the in…
Objective: - This article will help user in how to convert their numeric value become words. How to use 1. You can copy this code in your Unit as function 2. than you can perform your function by type this code The Code   (CODE) The Im…
This is my first video review of Microsoft Bookings, I will be doing a part two with a bit more information, but wanted to get this out to you folks.
In this video, Percona Solution Engineer Rick Golba discuss how (and why) you implement high availability in a database environment. To discuss how Percona Consulting can help with your design and architecture needs for your database and infrastr…
Suggested Courses
Course of the Month15 days, 6 hours left to enroll

741 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question