AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

CD-Laufwerkslade offen?

Ein Thema von Garfield · begonnen am 25. Nov 2006 · letzter Beitrag vom 25. Mär 2008
Antwort Antwort
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.326 Beiträge
 
Delphi XE5 Professional
 
#1

CD-Laufwerkslade offen?

  Alt 25. Nov 2006, 17:03
Ich habe viele Seiten mit der Frage gefunden, wie man in Delphi feststellen kann, ob die Laufwerkslade geöffnet oder geschlossen ist. Ausser in der BassCD.Dll habe ich keine nutzbare Funktion gefunden.

Unter Linux soll das funktionieren:
Zitat:
/* open device */
fd = open(device, O_RDONLY | O_NONBLOCK);
if (fd < 0) {
fprintf (stderr, "%s: open failed for `%s': %s\n",
program, device, strerror (errno));
exit (1);
}

/* Check CD player status */

printf ("Drive status: ");
status = ioctl (fd, CDROM_DRIVE_STATUS, CDSL_CURRENT);
if (status<0) {
perror(" CDROM_DRIVE_STATUS");
} else switch(status) {
case CDS_DISC_OK:
printf ("Ready.\n");
break;
case CDS_TRAY_OPEN:
printf ("Tray Open.\n");
break;
case CDS_DRIVE_NOT_READY:
printf ("Drive Not Ready.\n");
break;
default:
printf ("This Should not happen!\n");
break;
}
Könnte man den ioctl-Befehl übersetzen und hoffen, dass die Funktion unter Windows existiert bzw herausfinden wie es in der BassCD.Dll funktioniert?

Als Definitionen habe ich bisher gefunden:
Zitat:
#define CDROMEJECT 0x5309 /* Ejects the cdrom media */
#define CDROMCLOSETRAY 0x5319 /* Reverse of CDROMEJECT */
#define CDROM_DRIVE_STATUS 0x5326 /* Get tray position, etc. */

#define CDS_NO_INFO 0 /* if not implemented */
#define CDS_NO_DISC 1
#define CDS_TRAY_OPEN 2
#define CDS_DRIVE_NOT_READY 3
#define CDS_DISC_OK 4
Die blosse Übernahme der Konstante funktioniert natürlich nicht.
Ciao Garfield
W81: Laz1.6/FPC3, D7PE, DXE5Prof - Ubuntu: Laz1.6/FPC3
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.326 Beiträge
 
Delphi XE5 Professional
 
#2

Re: CD-Laufwerkslade offen?

  Alt 26. Nov 2006, 21:25
Im Forum von un4seen verrät man natürlich auch nicht, wie es funktioniert.

http://www.un4seen.com/forum/index.p...27135#msg27135
Ciao Garfield
W81: Laz1.6/FPC3, D7PE, DXE5Prof - Ubuntu: Laz1.6/FPC3
  Mit Zitat antworten Zitat
Wishmaster

Registriert seit: 14. Sep 2002
Ort: Steinbach, MB, Canada
293 Beiträge
 
Delphi XE2 Architect
 
#3

Re: CD-Laufwerkslade offen?

  Alt 26. Nov 2006, 23:32
Hi

BassCD.dll basiert auf dem SourceForge Projekt AKRip allerdings ist es in C, C++ geschrieben, so wen du Plan von C hast. http://xtractor.sourceforge.net/ and http://akrip.sourceforge.net/


Ich habe zwar keine Ahnung von C aber soweit ich erkennen konnte, die benutzen Sachen die es schon übersetzt für Delphi gibt.
http://sourceforge.net/projects/cddbcomp
oder
http://code.filehungry.com/product/l...urning_library
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.326 Beiträge
 
Delphi XE5 Professional
 
#4

Re: CD-Laufwerkslade offen?

  Alt 27. Nov 2006, 00:18
Danke für die Info.

Von C, C++ habe ich nur wenig Ahnung. Konnte mir in der Vergangenheit trotzdem einige Informationen aus C++ Sourcen ziehen.

In AKRip hatte ich nur mal kurz hineingesehen. Den Xtractor hatte ich bisher nur heruntergeladen. Die CDDBKomponente habe ich bisher nur für die Bezeichnung der CD-Laufwerke verwendet. Die CD Burning Library von Fish Soft ist eine Weiterentwicklung von Dancemammal. Da hatte ich mir nur die Imageerstellung von CD angesehen.

Dann werde ich mir die Sachen noch einmal genauer ansehen. Wenn ich von Montage zurück bin, werde ich berichten.
Ciao Garfield
W81: Laz1.6/FPC3, D7PE, DXE5Prof - Ubuntu: Laz1.6/FPC3
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.326 Beiträge
 
Delphi XE5 Professional
 
#5

Re: CD-Laufwerkslade offen?

  Alt 23. Dez 2006, 22:40
Bei der Durchsicht der Projekte habe ich im Projekt Freeburner/Burnlibrary eine Konstante dtMT_DOOROPEN = $71 bzw MT_DOOROPEN = $71; gefunden. Dazu habe ich bisher nur herausgefunden, dass es sich um ATAPI-Konstante handeln müsste.

Als Lösungsansätze kämen meiner Ansicht in Frage:

IODeviceControl
================


Verschiedene IOCTLs geben einen IO_Status_Block zurück. Desweiteren wird der Status stets als Ergebnis der Funktion DeviveIOControl zurückgegeben. Hier werden die Werte STATUS_SUCCESS (0 - Der Vorgang wurde erfolgreich beendet), STATUS_NO_MEDIA_IN_DEVICE und STATUS_DEVICE_NOT_READY (21 - Das Gerät ist nicht bereit) benötigt. Dafür bietet sich zum Beispiel IOCTL_CDROM_CHECK_VERIFY an.

Für die Funktion sind lediglich Leserechte notwendig, sodass sie auch bei eingeschränkten Usern funktionieren sollte.

Allerdings hat diese Funktion nicht den gewünschten Erfolg gebracht.

Mechanismus
===========


In der TIsoLib bin ich auf eine Funktion gestossen, welche den Status des Mechanismus eines Changers abfragt. Der MechanismStatus beinhaltet den MechanismStatusHeader mit dem Wert MechanismState_DoorOpen_CurrentSlot, welcher den Status der Schublade angibt.

Da die Funktion IOCTL_SCSI_PASS_THROUGH_DIRECT Schreibrechte (Burn Rights) benötigt, funktioniert es standardmäßig nur bei Administratoren. Eingeschränkten bzw Hauptbenutzern müssen die entsprechenden Rechte erteilt werden.

WMI
===


Bei Changern gibt es
Zitat:
WMI_CHANGER_PROBLEM_DEVICE_ERROR
- ChangerPerformDiagnostics
- CHANGER_DEVICE_PROBLEM_TYPE
- DeviceProblemDoorOpen = Indicates the changer's door is open.
Damit kann ich allerdings im Moment wenig anfangen.

Die Sourcen anbei. Kompiliert mit Turbo Delphi Win32 Explorer unter Win2000.
Angehängte Dateien
Dateityp: rar cdromdoor_mech_713.rar (174,6 KB, 31x aufgerufen)
Dateityp: rar cdromdoor_ioctl_424.rar (173,2 KB, 26x aufgerufen)
Ciao Garfield
W81: Laz1.6/FPC3, D7PE, DXE5Prof - Ubuntu: Laz1.6/FPC3
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#6

Re: CD-Laufwerkslade offen?

  Alt 23. Dez 2006, 22:45
Zitat von Garfield:
Allerdings hat diese Funktion nicht den gewünschten Erfolg gebracht.
Der da wäre? Wenn eine CD im Laufwerk ist, funktioniert es ja....
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.326 Beiträge
 
Delphi XE5 Professional
 
#7

Re: CD-Laufwerkslade offen?

  Alt 23. Dez 2006, 23:13
Zitat von Daniel G:
Der da wäre? Wenn eine CD im Laufwerk ist, funktioniert es ja....
Wie im Titel formuliert, geht es darum, herauszufinden, ob die Lade geöffnet oder geschlossen ist.

Die Funktion soll laut Beschreibung unter anderem die Statusmeldungen

* STATUS_SUCCESS
* STATUS_NO_MEDIA_IN_DEVICE
* STATUS_DEVICE_NOT_READY

zurückgeben. Die erste kommt, wenn eine CD eingelegt ist. Sonst die letzte. Die zweite Meldung fehlt.
Ciao Garfield
W81: Laz1.6/FPC3, D7PE, DXE5Prof - Ubuntu: Laz1.6/FPC3
  Mit Zitat antworten Zitat
Daniel G
(Gast)

n/a Beiträge
 
#8

Re: CD-Laufwerkslade offen?

  Alt 23. Dez 2006, 23:39
*snip*

'tschuldigung, falscher Button...
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.326 Beiträge
 
Delphi XE5 Professional
 
#9

Re: CD-Laufwerkslade offen?

  Alt 25. Mär 2008, 07:53
Ich habe mal wieder versucht, mittels IOCTL zum Erfolg zu kommen.

Bei der Funktion:
Delphi-Quellcode:
Result := DeviceIOControl(DriveHandle,
                          IOCTL_STORAGE_CHECK_VERIFY,
                          NIL,
                          0,
                          NIL,
                          0,
                          nb,
                          NIL);
ist Result = False, wenn die Schublade geöffnet ist oder sich in der geschlossenen Schublade kein Datenträger befindet. Befindet sich in der Schublade ein Datenträger ist Result = True.

Mit der Funktion:
Delphi-Quellcode:
var
  VolumeLabel : Array[0..$FF] of Char;
  FileSystem : Array[0..$FF] of Char;
  SerialNumber: DWord;
  DW : DWord;
  FileSysFlags: DWord;
...

begin
...
Result := GetVolumeInformation(PChar(Format('%s:\', [cDrive])),
                               VolumeLabel,
                               SizeOf(VolumeLabel),
                               @SerialNumber,
                               DW,
                               FileSysFlags,
                               FileSystem,
                               SizeOf(FileSystem));
lässt sich dann feststellen, was eingelegt ist. Bei einer bespielten CD bzw DVD ist Result = True und VolumeLabel gibt den Namen des Datenträgers und das FileSystem CDFS oder beispielsweise UDF zurück. Ist der Datenträger leer, ist in der Regel Result = False und die Fehlermeldung heißt: "Unzulässige Funktion". In der Regel bedeutet, dass ich beim Einlegen eines CD-Rohlings Result = True und FileSystem = '' erhielt. Wurde dann ein DVD-Rohling eingelegt war Result = False. Anschließend ergab ein CD-Rohling ebenfalls das Ergebnis 'Unzulässige Funktion'.

Nachtrag: In der MSDN ist angegeben, dass IOCTL_STORAGE_CHECK_VERIFY keine Daten zurückliefert. Dem ist jedoch nicht so. Wenn man den lpOutBuffer verwendet, hat man einen Zähler, wie oft das Laufwerk geöffnet und geschlossen wurde. Der Zähler beginnt mit dem ersten Aufruf.
Miniaturansicht angehängter Grafiken
bild1_213.png  
Ciao Garfield
W81: Laz1.6/FPC3, D7PE, DXE5Prof - Ubuntu: Laz1.6/FPC3
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:46 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf