Newsgroup: it.comp.lang.delphi
Titolo: Determinare se un CD è inserito nel drive

Salve, vorrei sapere anzittutto due cose:
- Quali sono i drive CDROM? (se esistono, quali lettere di drive sono)
- Il CDROM è inserito nel drive? (senza fare ad esempio una funzione tipo
DIR e vedere se dà errore o no). Ho visto che nelle multimedia api c'è
qualcosa, ma non le so usare molto bene
grazie!
p.s. ho delphi 6
--------------------------------
Inviato via 
http://usenet.libero.it

// per avere la notifica dell'inserimento / estrazione del cd dall'unità
type
  TForm1 = class(TForm)
  private
    procedure WMDeviceChange(var Msg: TMessage); message WM_DEVICECHANGE;
  public
  end;
{...}
implementation
{$R *.DFM}
procedure TForm1.WMDeviceChange(var Msg: TMessage);
const
  DBT_DEVICEARRIVAL = $8000; // system detected a new device
  DBT_DEVICEREMOVECOMPLETE = $8004;  // device is gone
var
  myMsg: string;
begin
  inherited;
  case Msg.wParam of
    DBT_DEVICEARRIVAL: myMsg  := 'CD inserted!';
    DBT_DEVICEREMOVECOMPLETE: myMsg := 'CD removed!';
  end;
  ShowMessage(myMsg);
end;
// per controllare se il cd-rom è aperto
uses
  mmsystem;
procedure TForm1.Button1Click(Sender: TObject);
var
  s: array[0..64] of Char;
  error: Cardinal;
  Text: array[0..255] of Char;
begin
  error := mciSendstring('open cdaudio alias geraet', nil, 0, Handle);
  if error <> 0 then
  begin
    mciGetErrorstring(error, @Text, 255);
    ShowMessage(Text);
    mciSendstring('close geraet', nil, 0, Handle);
    Exit;
  end;
  error := mciSendstring('status geraet mode', @s, SizeOf(s), Handle);
  if error <> 0 then
  begin
    mciGetErrorstring(error, @Text, 255);
    ShowMessage(Text);
    mciSendstring('close geraet', nil, 0, Handle);
    Exit;
  end;
  mciSendstring('close geraet', nil, 0, Handle);
  ShowMessage('Message: ' + s);
end;
// per recuperare la lettera del first cd - rom / il numero dei cd-rom
presenti
function GetFirstCDROMDrive: char;
var
  drivemap, mask: DWORD;
  i: integer;
  root: string;
begin
  Result := #0;
  root := 'A:\';
  drivemap := GetLogicalDrives;
  mask := 1;
  for i := 1 to 32 do
  begin
    if (mask and drivemap) <> 0 then
      if GetDriveType(PChar(root)) = DRIVE_CDROM then
      begin
        Result := root[1];
        Break;
      end;
    mask := mask shl 1;
    Inc(root[1]);
  end;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  ShowMessage(GetFirstCDROMDrive);
end;
{********************************}
function GetNumberOfCDDrives: Byte;
var
  drivemap, mask: DWORD;
  i: integer;
  root: string;
begin
  Result := 0;
  root := 'A:\';
  drivemap := GetLogicalDrives;
  mask := 1;
  for i := 1 to 32 do
  begin
    if (mask and drivemap) <> 0 then
      if GetDriveType(PChar(root)) = DRIVE_CDROM then
      begin
        Inc(Result);
      end;
    mask := mask shl 1;
    Inc(root[1]);
  end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
  Label1.Caption := IntToStr(GetNumCDDrives);
end;
CIAOUX

 qualcosa, ma non le so usare molto bene
const
   OKStr = 'Drive %s is a cd drive and contains a disk';
   KOStr = 'Drive %s is a cd drive and doesn''t contain a disk';
procedure GetCDDriveLetters(L: TStrings);
var
  DriveLetter: Char;
begin
  L.Clear;
  for DriveLetter := 'A' to 'Z' do
  begin
    if GetDriveType(PChar(DriveLetter+':\')) = DRIVE_CDROM then
    begin
      L.Add(DriveLetter);
    end;
  end;
end;
procedure TForm1.btnCDCheckClick(Sender: TObject);
var
  CDDrives: TStringList;
  I: Integer;
  MaximumComponentLength: DWORD;
  FileSystemFlags: DWORD;
  VolumeName: array [0..63] of Char;
begin
  CDDrives := TStringList.Create;
  try
    GetCDDriveLetters(CDDrives);
    for I := 0 to CDDrives.Count-1 do
    begin
      if GetVolumeInformation(PChar(CDDrives.Strings[I] + ':\'),
                              VolumeName,
                              SizeOf(VolumeName),
                              nil,
                              MaximumComponentLength,
                              FileSystemFlags,
                              nil,
                              0) then
        ShowMessage(Format(OKStr, [CDDrives.Strings[I]]))
      else
        ShowMessage(Format(KOStr, [CDDrives.Strings[I]]));
    end;
  finally
    CDDrives.Free;
  end;
end;
