CD-ROM
  1. Audio CD
  2. how to eject and close CD-Drive?
  3. CDROM drives library[NEW]

Audio CD

From: "Chris Rankin" <RankinC@Logica.com>

Vincent Oostindie <vincent.oostindie@tip.nl> wrote
> * How do I get the unique number from an audio CD in the CD-ROM drive?

const
  MCI_INFO_PRODUCT                = $00000100;
  MCI_INFO_FILE                   = $00000200;
  MCI_INFO_MEDIA_UPC              = $00000400;
  MCI_INFO_MEDIA_IDENTITY         = $00000800;
  MCI_INFO_NAME                   = $00001000;
  MCI_INFO_COPYRIGHT              = $00002000;

{ parameter block for MCI_INFO command message }
type
  PMCI_Info_ParmsA = ^TMCI_Info_ParmsA;
  PMCI_Info_ParmsW = ^TMCI_Info_ParmsW;
  PMCI_Info_Parms = PMCI_Info_ParmsA;
  TMCI_Info_ParmsA = record
    dwCallback: DWORD;
    lpstrReturn: PAnsiChar;
    dwRetSize: DWORD;
  end;
  TMCI_Info_ParmsW = record
    dwCallback: DWORD;
    lpstrReturn: PWideChar;
    dwRetSize: DWORD;
  end;
  TMCI_Info_Parms = TMCI_Info_ParmsA;

These are the buffers you want: the identifier is returned as a string of decimal digits by the MCI_INFO_MEDIA_IDENTITY function. You should be able to cross-reference this with the online help (Win32 and TMediaPlayer component).

how to eject and close CD-Drive?

From: Christian Piene Gundersen <j.c.p.gundersen@jusstud.uio.no>

ClaWenkel wrote:
>
> Is there any API command in Delphi2 to eject AND CLOSE the CD-ROM Drive
> physically e.g. by clicking on a button? I don't want to use the
> TMediaPlayer component (which can only eject...)
> thanks in advance, ClaWenkel

To open the CD-ROM:


        mciSendString('Set cdaudio door open wait', nil, 0, handle); 

To close the CD-ROM:


        mciSendString('Set cdaudio door closed wait', nil, 0, handle); 

Remember to include the MMSystem unit in your uses clause.

CDROM drives library[NEW]

From: "Jason Wallace" <DarkElf@SLSoftware.reno.nv.us>

GetCD_ID returns the serial number of the CD (as CDPLAYER.EXE does...)

GetCD_Label returns the label of the CD (which will either be a "DOS label", 'AUDIO CD' or 'No CD Present'

FindFirstCDROM returns the first CD Rom it finds (for instance 'D:\') -- it uses the ListDrives function (which returns a TStringList of all available drives on a given PC....)

As for the rest: Win95 uses AutoPlay which, if it's label is 'AUDIO CD' automatically starts the CD player, or if it returns a "DOS Label" it looks for the file 'Autorun.ini" (or .Inf (always forget which...)) and goes from there (take a look in that file. 90% of the time you'll see 'OPEN = xxxxx' (where xxx is the file Autoplay starts when the CD is inserted and 'ICON = xxxxx' which is the icon Autoplay will use..)


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;


Please email me and tell me if you liked this page.