| Autor |
Beitrag |
LonghornUser
      
Beiträge: 796
|
Verfasst: Di 06.10.09 18:02
Hallo,
wie kann ich herausfinden, ob ein CD-Laufwerk gerade offen oder geschlossen ist?
Danke schon mal!
Ciao LHUser
|
|
Dunkel
      
Beiträge: 682
Mac OS X Snow Leopard
Xcode 3.1
|
Verfasst: Di 06.10.09 19:04
Hallo!
Und was machst Du bei einem Slot-In-Laufwerk? Ist das ständig offen oder ständig zu?
_________________ Ich streite einsam mich mit dieser Oberflächenwelt
Gutes sei ein löblich Brot von dem ich zehre - bis zum Tod [Das Ich - Im Ich]
|
|
FinnO
      
Beiträge: 1331
Erhaltene Danke: 123
Mac OSX, Arch
TypeScript (Webstorm), Kotlin, Clojure (IDEA), Golang (VSCode)
|
Verfasst: Di 06.10.09 19:16
du kannst immerhin überprüfen ob eine gewisse datei in dem CD-Laufwerk ist.
Delphi-Quelltext 1:
| if fileexists('E:\DeineDatei.txt') then... |
|
|
Boldar
      
Beiträge: 1555
Erhaltene Danke: 70
Win7 Enterprise 64bit, Win XP SP2
Turbo Delphi
|
Verfasst: Di 06.10.09 19:41
Gingen Laufwerksabfragen nicht über WMI??
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Di 06.10.09 21:10
Bei Notebook-Laufwerken ist so eine Überprüfung natürlich nicht möglich, aber ich will folgendes machen:
Per Button soll ein Laufwerk, je nach dessen aktuellem Zustad geöffnet oder geschlossen werden. Geht das aus irgendeinem Grund nicht (Slot-Laufwerk oder Fehler), soll einfach nichts getan werden.
Geht das irgendwie?
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 06.10.09 21:58
vielleicht hilft dir ja das hier weiter:
www.swissdelphicente.../showcode.php?id=124
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Mi 07.10.09 14:55
@elundril: Ich habe das ganze mal probiert. Und zwar so:
Delphi-Quelltext 1: 2:
| Button1 (Open): if OpenCD('E') = False then showmessage('Fehler'); |
Leider ohne Erfolg. Wenn das Laufwerk (was ein ganz normales 5,25" ist) durch den Befehl geöffnet wird, gibt die Funktion trotzdem False zurück. Dadurch ist auch mein zweiter gedanklicher Schritt leider unbrauchbar:
Delphi-Quelltext 1: 2: 3:
| if OpenCD('E') = False then if CloseCD('E') = False then showmessage('Fehler'); |
Kann da jemand weiterhelfen?
|
|
Tryer
      
Beiträge: 226
Erhaltene Danke: 7
|
Verfasst: Mi 07.10.09 18:51
Das die Funktion False liefert liegt daran das sie fehlerhaft ist. " if res = 0 then Exit;" macht keinen Sinn da bei Erfolg 0 zurückgegeben wird -> einfach nur " Result := res = 0;"
Leider gibt mciSendString auch 0 ("Fehlerfrei") zurück wenn ein Laufwerk was nur manuell zu schliessen ist geschlossen werden soll, die Auswertung hilft also nicht weiter.
Zuverlässiger wären zwei getrennte Buttons zum öffnen/schliessen, oder Du versuchst es so:
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: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54:
| ... FLastCmdWasOpenDoor: Boolean; ... FLastCmdWasOpenDoor := False; ... procedure ToggleDoor(Drive: Char); var OpenError: Cardinal;
procedure OpenDrive(ADriveChar: Char; AOpen: Boolean); const OpenStr: array[False..True] of string = ('closed', 'open'); begin if mciSendString(PChar('open ' + ADriveChar + ': type cdaudio alias cdlw'), nil, 0, 0) = 0 then begin mciSendString(PChar('set cdlw door ' + OpenStr[AOpen] + ' wait'), nil, 0, 0); mciSendString('close cdlw', nil, 0, 0); end; end;
function GetOpenRootError(D: Char): Cardinal; var Handle: THandle; begin {$I-} Handle := CreateFile( PChar(D + ':\'), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, 0); Result := GetLastError; if Handle <> INVALID_HANDLE_VALUE then CloseHandle(Handle); {$I+} end;
begin if GetOpenRootError(Drive) = ERROR_NOT_READY then begin if FLastCmdWasOpenDoor then OpenDrive(Drive, False) else OpenDrive(Drive, True); FLastCmdWasOpenDoor := not FLastCmdWasOpenDoor; end else begin OpenDrive(Drive, True); FLastCmdWasOpenDoor := True; end; end; |
Wenn der Zugriff auf die CD klappt bzw. wenn der Fehler ein anderer als "nicht bereit" ist, dann war die Schublade zu und wird geöffnet. Ansonsten kann nicht zwischen leer und offen unterschieden werden, daher wird hin und her gewechselt. Im Fall das das Laufwerk also leer ist muss man ggf. zweimal klicken um zum gewünschten Ergebnis zu kommen.
Grüsse, Dirk
Zuletzt bearbeitet von Tryer am Do 08.10.09 04:57, insgesamt 1-mal bearbeitet
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Mi 07.10.09 19:18
Wow, danke für deine Arbeit! Ich schaue morgen dann mal drüber unnd berichte
Edit: Konnte es nicht mehr abwarten und habe es heute noch getestet. Funktioniert bestens, vielen Dank! Nur, wenn der User selbst eingreift und das Laufwerk selbst bedient, kommt es zu Unregelmäßigkeiten. Echt spitze!
|
|
Garf
      
Beiträge: 54
Erhaltene Danke: 2
D3Prof, D7PE, TDE
|
Verfasst: Do 08.10.09 19:34
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Do 08.10.09 19:39
@Garf: Das reicht mir so. Ist so dann doch in Ordnung 
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Fr 09.10.09 01:09
Um was ging es dir jetzt eigentlich?
|
|
LonghornUser 
      
Beiträge: 796
|
Verfasst: Fr 09.10.09 13:13
Darum, eine zufriedenstellende Lösung zu finden.
|
|
Garf
      
Beiträge: 54
Erhaltene Danke: 2
D3Prof, D7PE, TDE
|
Verfasst: Sa 10.10.09 16:09
Ist aber nicht die Lösung für die gestellte Frage. 
|
|
Tryer
      
Beiträge: 226
Erhaltene Danke: 7
|
Verfasst: Sa 10.10.09 17:48
Da mein Versuch dem Anliegen von LHUser im Rahmen meiner Kenntnisse mgl. nahe zu kommen Dir nicht zusagt darfst Du meinen Vorschlag gerne ignorieren und eine bessere Lösung bereitstellen (die deine bisherigen Links ja auch nicht bieten). Gelesen hast Du seine Frage zwar, verstanden was er möchte wohl weniger. Dumme Kommentare zu den Ideen anderer kannst Du Dir sparen, damit ist niemandem geholfen.
Grüsse, Dirk
|
|
Garf
      
Beiträge: 54
Erhaltene Danke: 2
D3Prof, D7PE, TDE
|
Verfasst: Mo 12.10.09 12:54
Ich verstehe nicht, warum Du mich hier anfeindest. Dein Beispiel habe ich nicht kommentiert und für LonghornUser stellt es eine "zufriedenstellende" Lösung dar. Da es aber nur unter Beachtung der Bedingungen
- Das Laufwerk muss bis zur ersten Betätigung durch Dein Beispiel geschlossen sein.
- Das Laufwerk darf nur über Deinen Beispielsource betätigt werden.
- Das Laufwerk darf nicht manuell oder durch eine andere Anwendung betätigt werden.
zuverlässig funktioniert, ist nach meiner Meinung die Frage
LonghornUser hat folgendes geschrieben : | | wie kann ich herausfinden, ob ein CD-Laufwerk gerade offen oder geschlossen ist? |
nicht beantwortet.
Oben habe ich auf meine Frage in der Delphi-PRAXIS verlinkt. Dort gibt es in #5 eine Lösung über den Changer Mechanismus, welche lediglich "Schreibrechte" benötigt. Im Text ist zwar kein Beispielcode angegeben, aber es gibt einen Anhang mit einem Demoprojekt.
Gruß Garf
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 12.10.09 13:36
Ich verfolge den Thread hier schon einige Tage und wundere mich, warum "krampfhaft" versucht wird, eine Antwort auf die Frage im Titel zu finden.
Für das BS ist es doch völlig uninteressant, ob eine vorhandene Schublade offen oder geschlossen ist:
Wenn auf ein Laufwerk zugegriffen wird, wird das Laufwerk automatisch den CDROMCLOSETRAY-Befehl ausführen.
Für das BS ist es dann nur interessant, ob gelesen oder geschrieben werden kann...
In der folgenden Audio Components Suite ist untenstehende Funktion enthalten.
acs.ullihome.de/acs/downloads/acs23.zip
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| function GetCDStatus(cd_fd : Integer) : TCDStatus; var sci : cdrom_subchnl; res :Integer; begin res := ioctl(cd_fd, CDROM_DRIVE_STATUS, CDSL_CURRENT); case res of CDS_TRAY_OPEN, CDS_NO_DISC, CDS_DRIVE_NOT_READY: begin Result := cdsNotReady; Exit; end; end; . . . |
.
Anmerkungen:
Der Test mit dem Changer Mechanismus, welcher funktioniert.
www.delphipraxis.net/download.php?id=23890
Slot in-Laufwerk:
kein Medium: Meldung= geöffnet
mit Medium: Meldung= geschlossen
Der Test mit IOCTL, welcher leider (bei mir) nicht funktioniert.
www.delphipraxis.net/download.php?id=23891
Slot in-Laufwerk:
kein Medium: Meldung= [21] Das Gerät ist nicht bereit.
mit Medium: Meldung= [0] Der Vorgang wurde erfolgreich beendet.
|
|
Garf
      
Beiträge: 54
Erhaltene Danke: 2
D3Prof, D7PE, TDE
|
Verfasst: Mo 12.10.09 14:52
Die Funktion aus der Audio Components Suite ist für Linux. Den ioctl-Aufruf habe ich bei meiner Frage auf Delphi-PRAXIS in #1 auch genannt.
Die Downloads funktionieren so nicht ("You are not authorized to view, download or link to this Site.") Man muss über die Seite www.delphipraxis.net...werkslade+offen.html gehen.
hathor hat folgendes geschrieben : | Slot in-Laufwerk:
kein Medium: Meldung= geöffnet
mit Medium: Meldung= geschlossen
...
Slot in-Laufwerk:
kein Medium: Meldung= [21] Das Gerät ist nicht bereit.
mit Medium: Meldung= [0] Der Vorgang wurde erfolgreich beendet. |
Interessant. Wusste ich bisher nicht. Danke.
Gruß Garf
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mo 12.10.09 16:55
Garf hat folgendes geschrieben : | Die Funktion aus der Audio Components Suite ist für Linux. Den ioctl-Aufruf habe ich bei meiner Frage auf Delphi-PRAXIS in #1 auch genannt.
Gruß Garf |
Die WINDOWS-Version ist auch enthalten.
Ich habe es auf
CodeGear™ Delphi® für Microsoft® Windows™ Version 11,2007
installiert.
|
|
Garf
      
Beiträge: 54
Erhaltene Danke: 2
D3Prof, D7PE, TDE
|
Verfasst: Mo 12.10.09 22:14
Dann muss ich mir den Source noch einmal ansehen. Danke für den Hinweis.
Gruß Garf
|
|