Entwickler-Ecke

Windows API - CD-Laufwerk öffnen / schliessen


Hochhaus - Mo 16.07.12 19:15
Titel: CD-Laufwerk öffnen / schliessen
Hallo allerseits !

der folgende Code öffnet resp. schliesst ein CD-Laufwerk:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Procedure TForm1.Button1Click(Sender: TObject);
Begin
  MCISendString('Set cdaudio door open wait'Nil0, Application.Handle);
End;


{* CD-Laufwerk schliessen *}

Procedure TForm1.Button2Click(Sender: TObject);
Begin
  MCISendString('Set cdaudio door closed wait'Nil0, Application.Handle);
End;


Was tue ich aber, wenn der PC zwei oder drei Laufwerke hat ?


Vielen Dank im Voraus für die Antworten !


Hochhaus


Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 16.07.2012 um 22:19


Delete - Mo 16.07.12 19:29

Die Antwort findest Du hier:
http://msdn.microsoft.com/en-us/library/windows/desktop/dd743441%28v=vs.85%29.aspx
Du brauchst die MCIDEVICEID.


Gerd Kayser - Mo 16.07.12 19:55

user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Was tue ich aber, wenn der PC zwei oder drei Laufwerke hat ?


Man verwendet einen Alias. Beispiel (hier für Laufwerk N):


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
begin
  mciSendString('open N: type cdAudio alias CD1'nil00);
  mciSendString('set CD1 door open'nil00);
  mciSendString('close CD1'nil00);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  mciSendString('open N: type cdAudio alias CD1'nil00);
  mciSendString('set CD1 door closed'nil00);
  mciSendString('close CD1'nil00);
end;


Hochhaus - Mo 16.07.12 20:03

user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Was tue ich aber, wenn der PC zwei oder drei Laufwerke hat ?


Man verwendet einen Alias. Beispiel (hier für Laufwerk N):


Das funktioniert nur, wenn ich die Laufwerksbuchstaben kenne. Jedes Gerät hat aber wieder andere Laufwerksbuchstaben und das Ganze ist dann nicht portabel. Mein Code oben funktioniert immer bei Geräten mit einem CD-Laufwerk - unabhängig von dessen Laufwerksbuchstaben.


Gerd Kayser - Mo 16.07.12 20:24

user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Das funktioniert nur, wenn ich die Laufwerksbuchstaben kenne.

Mit GetDriveType kann man ermitteln, welche Laufwerksbuchstaben welchen Laufwerkstypen entsprechen.

Beispiel:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TForm1.Button3Click(Sender: TObject);
type
  TLaufwerkstyp = (dtUnknown, dtNoDrive, dtFloppy, dtFixed, dtNetwork, dtCDROM,
    dtRAM);
var
  Laufwerkstyp  : TLaufwerkstyp;
  Laufwerk      : string;
  Schleife      : integer;
begin
  for Schleife := 65 to 65 + 25 do
    begin
      Laufwerk := Chr(Schleife) + ':';
      Laufwerkstyp := TLaufwerkstyp(GetDriveType(PChar(Laufwerk)));
      case Laufwerkstyp of
        dtFloppy:  Memo1.Lines.Add(Laufwerk + ' = Wechseldatenträger (Floppy und Co.)');
        dtFixed:   Memo1.Lines.Add(Laufwerk + ' = Festplattenpartition');
        dtNetwork: Memo1.Lines.Add(Laufwerk + ' = Netzwerklaufwerk');
        dtCDROM:   Memo1.Lines.Add(Laufwerk + ' = CD-Laufwerk');
        dtRAM:     Memo1.Lines.Add(Laufwerk + ' = RAM-Laufwerk');
        dtUnknown: Memo1.Lines.Add(Laufwerk + ' = unbekanntes Laufwerk');
      else
        Memo1.Lines.Add(Laufwerk + ' = nicht vorhanden.');
      end;
    end;
end;


Hochhaus - Di 17.07.12 12:17

Danke !!

Hochhaus


Hochhaus - Mi 18.07.12 15:42

user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Was tue ich aber, wenn der PC zwei oder drei Laufwerke hat ?


Man verwendet einen Alias. Beispiel (hier für Laufwerk N):



Was läuft bei meinem Proggi schief ?


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
{* CD-Laufwerk öffnen *}

Procedure TForm1.Button1Click(Sender: TObject);
Var LW: Char;
Begin
  LW := ComboBox1.Text[1];
  mciSendString('open ' + LW + ': type cdAudio alias CD1'nil00); {64}
  mciSendString('set CD1 door open'nil00);
  mciSendString('close CD1'nil00);

End;


[DCC Fehler] CD.PAS(64): E2010 Inkompatible Typen: 'PWideChar' und 'string'


Zyklame - Mi 18.07.12 15:59

Du hast hier einen Normalen String und keine Konstante. Die Kann der Compiler nicht automatisch umwandeln.
Die Fehlermeldung sagt doch schon alles:
Zitat:
[DCC Fehler] CD.PAS(64): E2010 Inkompatible Typen: 'PWideChar' und 'string'

Ein einfacher Cast löst das Problem.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Procedure TForm1.Button1Click(Sender: TObject);
Var LW: Char;
Begin
  LW := ComboBox1.Text[1];
  mciSendString(PWideChar('open ' + LW + ': type cdAudio alias CD1'), nil00); {64}
  mciSendString('set CD1 door open'nil00);
  mciSendString('close CD1'nil00);
End;


Hochhaus - Do 19.07.12 18:35

user profile iconGerd Kayser hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Das funktioniert nur, wenn ich die Laufwerksbuchstaben kenne.

Mit GetDriveType kann man ermitteln, welche Laufwerksbuchstaben welchen Laufwerkstypen entsprechen.



Kann man da auch Untergruppen von Laufwerkstypen unterscheiden ? Z. Bsp. Blueray ,DVD, CD, DVD-RW, CD-RW etc. ? statt einfach dTCDROM .Der entsprechende Code würde mich sehr interessieren !

Danke,


Hochhaus


Delete - Do 19.07.12 19:20

Da wird man fündig:
http://msdn.microsoft.com/en-us/library/windows/desktop/ff551967%28v=vs.85%29.aspx


Hochhaus - Fr 20.07.12 09:20

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Da wird man fündig:
http://msdn.microsoft.com/en-us/library/windows/desktop/ff551967%28v=vs.85%29.aspx


Danke !!

Hochhaus


Hochhaus - So 22.07.12 19:53

Noch eine letzte Frage: Wie unterscheide ich ein virtuelles CDROM-Laufwerk von einem echten, realen CD-Laufwerk ?

Gruss,


Hochhaus


Gerd Kayser - So 22.07.12 21:31

user profile iconHochhaus hat folgendes geschrieben Zum zitierten Posting springen:
Wie unterscheide ich ein virtuelles CDROM-Laufwerk von einem echten, realen CD-Laufwerk ?


Besorge Dir MAGWMI von http://www.magsys.co.uk/delphi/magwmi.asp. Der Download und die Verwendung sind meines Wissens kostenlos. Sourcen und eine Testanwendung sind dabei.

Testhalber habe ich vorhin zwei virtuelle Laufwerke mit Virtual CloneDrive unter Windows 7 erzeugt und mir die CDROMs im Testprogramm anzeigen lassen. Bei den virtuellen Laufwerken fehlte bei Capabilities die 4 (= Supports Writing). Des Weiteren wurden die Laufwerke als SCSI-Laufwerke eingetragen. Es sind aber nur Indizien, keine Beweise. Aber wer hat heute noch SCSI-Laufwerke oder normale CD-Laufwerke ohne Brennfunktion im Einsatz?

Anbei ein Screenshot. Die ersten beiden Laufwerke sind die virtuellen Laufwerke. Die Bedeutung der einzelnen Werte ist hier nachzulesen: http://msdn.microsoft.com/en-us/library/windows/desktop/aa394081(v=vs.85).aspx


Delete - Mo 23.07.12 11:37

Über die SCSI-Angaben kann man virtuelle Laufwerke sicher nicht identifizieren.
Physikalisch haben die Wenigsten noch SCSI-LW, aber die Treiber sind auch bei WIN7 noch vorhanden.
Beispiel:
WIN 7 - 64Bit
Notebook, eingebaute HDD (SATA, IDE-Modus), SCSIPort 2 laut obengenanntem Programm (Magenta Test-WMI Subroutines)

Win32_DiskDrive: zeigt keine CDROM-Drives an
Win32_PhysicalMedia: kein Unterschied zwischen physikalisch und virtuell
Win32_DiskDrivePhysicalMedia: nichts
Win32_MappedLogicalDisk: nichts
Win32_LogicalDisk:
Drivetype 5 bei physikalischem CD/DVD und virtuellem BD-ROM
MediaType 11 bei physikalischem CD/DVD und virtuellem BD-ROM
Win32_cdromdrive - siehe Anhang