Autor Beitrag
Hochhaus
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: Mo 16.07.12 19:15 
Hallo allerseits !

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

ausblenden 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
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 16.07.12 19:29 
Die Antwort findest Du hier:
msdn.microsoft.com/e...41%28v=vs.85%29.aspx
Du brauchst die MCIDEVICEID.
Gerd Kayser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: 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):

ausblenden 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;

Für diesen Beitrag haben gedankt: Hochhaus
Hochhaus Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: 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:

ausblenden 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;

Für diesen Beitrag haben gedankt: Hochhaus
Hochhaus Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: Di 17.07.12 12:17 
Danke !!

Hochhaus
Hochhaus Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: 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 ?

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41
Erhaltene Danke: 1

Win 7 Professional
Delphi XE, Visual Studio 2010
BeitragVerfasst: 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.

ausblenden 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;

Für diesen Beitrag haben gedankt: Hochhaus
Hochhaus Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: 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
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 19.07.12 19:20 

Für diesen Beitrag haben gedankt: Hochhaus
Hochhaus Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: Fr 20.07.12 09:20 
user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
Da wird man fündig:
msdn.microsoft.com/e...67%28v=vs.85%29.aspx


Danke !!

Hochhaus
Hochhaus Threadstarter
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 662
Erhaltene Danke: 8

Windows 7
Delphi XE2
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 632
Erhaltene Danke: 121

Win 7 32-bit
Delphi 2006/XE
BeitragVerfasst: 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 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: msdn.microsoft.com/e...394081(v=vs.85).aspx
Einloggen, um Attachments anzusehen!

Für diesen Beitrag haben gedankt: Hochhaus
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: 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
Einloggen, um Attachments anzusehen!