Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi CD-Laufwerkslade offen? (https://www.delphipraxis.net/81352-cd-laufwerkslade-offen.html)

Garfield 25. Nov 2006 16:03


CD-Laufwerkslade offen?
 
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. :pale:

Garfield 26. Nov 2006 20:25

Re: CD-Laufwerkslade offen?
 
Im Forum von un4seen verrät man natürlich auch nicht, wie es funktioniert.

http://www.un4seen.com/forum/index.p...27135#msg27135

Wishmaster 26. Nov 2006 22:32

Re: CD-Laufwerkslade offen?
 
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

Garfield 26. Nov 2006 23:18

Re: CD-Laufwerkslade offen?
 
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.

Garfield 23. Dez 2006 21:40

Re: CD-Laufwerkslade offen?
 
Liste der Anhänge anzeigen (Anzahl: 2)
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.

Daniel G 23. Dez 2006 21:45

Re: CD-Laufwerkslade offen?
 
Zitat:

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....

Garfield 23. Dez 2006 22:13

Re: CD-Laufwerkslade offen?
 
Zitat:

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.

Daniel G 23. Dez 2006 22:39

Re: CD-Laufwerkslade offen?
 
*snip*

'tschuldigung, falscher Button... :oops:

Garfield 25. Mär 2008 06:53

Re: CD-Laufwerkslade offen?
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:36 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz