Solved

How do I eject two CD-Rom drives?

Posted on 2001-08-03
8
175 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
  • 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
 
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
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Suggested Solutions

Creating an auto free TStringList The TStringList is a basic and frequently used object in Delphi. On many occasions, you may want to create a temporary list, process some items in the list and be done with the list. In such cases, you have to…
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…
This tutorial gives a high-level tour of the interface of Marketo (a marketing automation tool to help businesses track and engage prospective customers and drive them to purchase). You will see the main areas including Marketing Activities, Design …
Both in life and business – not all partnerships are created equal. As the demand for cloud services increases, so do the number of self-proclaimed cloud partners. Asking the right questions up front in the partnership, will enable both parties …

863 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

Need Help in Real-Time?

Connect with top rated Experts

25 Experts available now in Live!

Get 1:1 Help Now