Solved

How do I eject two CD-Rom drives?

Posted on 2001-08-03
8
180 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
Industry Leaders: 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 100 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

Enroll in June's Course of the Month

June's Course of the Month is now available! Every 10 seconds, a consumer gets hit with ransomware. Refresh your knowledge of ransomware best practices by enrolling in this month's complimentary course for Premium Members, Team Accounts, and Qualified Experts.

Question has a verified solution.

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

Introduction The parallel port is a very commonly known port, it was widely used to connect a printer to the PC, if you look at the back of your computer, for those who don't have newer computers, there will be a port with 25 pins and a small print…
Have you ever had your Delphi form/application just hanging while waiting for data to load? This is the article to read if you want to learn some things about adding threads for data loading in the background. First, I'll setup a general applica…
Come and listen to Percona CEO Peter Zaitsev discuss what’s new in Percona open source software, including Percona Server for MySQL (https://www.percona.com/software/mysql-database/percona-server) and MongoDB (https://www.percona.com/software/mongo-…
Do you want to know how to make a graph with Microsoft Access? First, create a query with the data for the chart. Then make a blank form and add a chart control. This video also shows how to change what data is displayed on the graph as well as form…

690 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