![]() |
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:
Als Definitionen habe ich bisher gefunden: Zitat:
|
Re: CD-Laufwerkslade offen?
Im Forum von un4seen verrät man natürlich auch nicht, wie es funktioniert.
![]() |
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. ![]() ![]() Ich habe zwar keine Ahnung von C aber soweit ich erkennen konnte, die benutzen Sachen die es schon übersetzt für Delphi gibt. ![]() oder ![]() |
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. |
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:
Die Sourcen anbei. Kompiliert mit Turbo Delphi Win32 Explorer unter Win2000. |
Re: CD-Laufwerkslade offen?
Zitat:
|
Re: CD-Laufwerkslade offen?
Zitat:
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. |
Re: CD-Laufwerkslade offen?
*snip*
'tschuldigung, falscher Button... :oops: |
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:
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.
Result := DeviceIOControl(DriveHandle,
IOCTL_STORAGE_CHECK_VERIFY, NIL, 0, NIL, 0, nb, NIL); Mit der Funktion:
Delphi-Quellcode:
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'.
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)); 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 13:35 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz