Kennt jemand eine Methode zum programmatischen Schließen des CD-Fachs unter Windows 2000 oder höher? Es ist ein CD-Fach vorhanden, aber ich kann es nicht besonders unter W2k schließen.
Ich suche insbesondere nach einer Methode, um dies aus einer Batch-Datei zu tun, wenn möglich, aber API-Aufrufe wären in Ordnung.
Ich benutze gerne DeviceIOControl, da es mir die Möglichkeit gibt, beliebige Wechseldatenträger (wie USB- und Flash-Disks sowie CD-Trays) auszuwerfen. Da codez, um einen Datenträger ordnungsgemäß mit DeviceIOControl auszuwerfen, ist (fügen Sie einfach eine ordnungsgemäße Fehlerbehandlung hinzu):
%Vor%Ich habe bemerkt, dass die Antwort von Andreas Magnusson nicht ganz so funktioniert wie die Eject-Taste des Explorers. Insbesondere wurde das Laufwerk im Explorer nicht mit dem Andreas-Code ausgegraut, sondern mit dem Befehl Eject. Also habe ich Nachforschungen angestellt.
Ich habe API Monitor ausgeführt, während ich den Eject-Befehl vom Explorer (Windows 7 SP1 64-Bit) ausgeführt habe. Ich fand auch einen guten MSKB-Artikel 165721 mit dem Titel Auswerfen von Wechselmedien in Windows NT / Windows 2000 / Windows XP . Der interessanteste Teil des MSKB Artikels ist unten zitiert:
- Rufen Sie CreateFile mit GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE und OPEN_EXISTING auf. Der Parameter LpFileName sollte \. \ X sein: (wobei X der tatsächliche Laufwerksbuchstabe ist). Alle anderen Parameter können Null sein.
- Sperren Sie das Volume, indem Sie die FSCTL_LOCK_VOLUME-IOCTL über DeviceIoControl absetzen. Wenn eine andere Anwendung oder das System das Volume verwendet, schlägt diese IOCTL fehl. Sobald diese Funktion erfolgreich zurückgegeben wird, wird der Anwendung garantiert, dass das Volume von nichts anderem im System verwendet wird.
- Heben Sie die Bereitstellung des Volumes auf, indem Sie die FSCTL_DISMOUNT_VOLUME-IOCTL absetzen. Dies führt dazu, dass das Dateisystem alle Kenntnisse des Datenträgers entfernt und alle internen Informationen, die es bezüglich des Datenträgers enthält, verwirft.
- Stellen Sie sicher, dass das Medium entfernt werden kann, indem Sie IOCTL_STORAGE_MEDIA_REMOVAL IOCTL absetzen. Setzen Sie das Member PreventMediaRemoval der Struktur PREVENT_MEDIA_REMOVAL auf FALSE, bevor Sie dieses IOCTL aufrufen. Dies verhindert, dass das Gerät die Entfernung des Mediums verhindert.
- Werfen Sie die Medien mit der IOCTL_STORAGE_EJECT_MEDIA IOCTL aus. Wenn das Gerät keinen automatischen Auswurf zulässt, kann IOCTL_STORAGE_EJECT_MEDIA übersprungen werden und der Benutzer kann angewiesen werden, das Medium zu entfernen.
- Schließen Sie das Volume-Handle, das Sie im ersten Schritt erhalten haben, oder geben Sie die FSCTL_UNLOCK_VOLUME IOCTL aus. Dadurch kann das Laufwerk von anderen verwendet werden Prozesse.
Andreas 'Antwort, der MSKB-Artikel und mein API-Sniffing von Explorer können wie folgt zusammengefasst werden:
CreateFile
aufgerufen, um das Volume zu öffnen. (Alle Methoden). DeviceIoControl
wird mit FSCTL_LOCK_VOLUME
aufgerufen . (Alle Methoden). DeviceIoControl
wird mit FSCTL_DISMOUNT_VOLUME
aufgerufen . (Nur Andreas und MSKB Methoden. Explorer nennt das nicht aus irgendeinem Grund. Diese IOCTL scheint zu beeinflussen, ob das Laufwerk im Explorer ausgegraut ist oder nicht. Ich bin nicht sicher, warum Explorer dies nicht nennt). DeviceIoControl
aufgerufen mit IOCTL_STORAGE_MEDIA_REMOVAL
und PREVENT_MEDIA_REMOVAL
member auf FALSE
gesetzt (MSKB- und Explorer-Methoden. Dieser Schritt fehlt in Andreas 'Antwort). DeviceIoControl
aufgerufen mit IOCTL_STORAGE_EJECT_MEDIA
( Andreas und MSKB Artikel) oder IOCTL_DISK_EJECT_MEDIA
(Explorer; beachten Sie, dass IOCTL veraltet ist und durch das STORAGE IOCTL ersetzt wurde. Nicht sicher, warum Explorer immer noch den alten verwendet). Zum Schluss habe ich beschlossen, das im MSKB-Artikel beschriebene Verfahren zu befolgen, da es das gründlichste und vollständigste Verfahren zu sein schien, unterstützt durch einen MSKB-Artikel.