![]() |
CD Laufwerk öffen - Wo ist das Problem?
Hallo,
ich versuche mittels DeviceIOControl ein CD Laufwerk zu öfnnen und habe daher folgendes recherchiert und zusammengebastelt:
Delphi-Quellcode:
So ausführen ist ja kein Problem nur bekomm ich eine Zugriffsverletzung in der kernel32.dll und nichts passiert, also das LW öffnet sich nicht.
procedure TForm1.Button2Click(Sender: TObject);
var handle: THandle; test: PSecurityAttributes; back: Boolean; return: Cardinal; tt: POverlapped; begin handle := CreateFile('\\\\.\\PhysicalDrive0',GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,NIL,OPEN_EXISTING,0,0); back := DeviceIOControl(handle,IOCTL_STORAGE_EJECT_MEDIA,NIL,0,NIL,0,return,tt); end; Der Fehler liegt bei DeviceIOControl, den nach dem debugging weiß ich das CreateFile keinen Fehler aufruft. Doch wo liegt der Fehler ? Danke schonmal im Voraus. |
Re: CD Laufwerk öffen - Wo ist das Problem?
Ich weiß nciht, wo der Fehler liegt, aber verscuh doch mal das: (außer es MUSS mit dem DeviceIOControl gemacht werden)
![]() |
Re: CD Laufwerk öffen - Wo ist das Problem?
Muß die Variable tt nicht vom Typ TOverlapped sein?
Gruß Hawkeye //Edit: die Übergabe ist dann "@tt" |
Re: CD Laufwerk öffen - Wo ist das Problem?
Is' PhysicalDrive0 nicht eigentlich immer die HDD? Ich mein, die lässt sich ja nicht auswerfen, oder? :stupid:
@vlees: Bei deinem Link ist es aber nicht möglich das Laufwerk auszuwählen. Es ist definitiv über ASPI/SPTI machbar. |
Re: CD Laufwerk öffen - Wo ist das Problem?
bei mir zeigt der Compiler bei IOCTL_STORAGE_EJECT_MEDIA "Undefinierter Bezeichner" an (delphi-ver. steht links (D6 prof))
|
Re: CD Laufwerk öffen - Wo ist das Problem?
Jupp, gibt's ja auch erst seit NT 4.0
Zitat:
|
Re: CD Laufwerk öffen - Wo ist das Problem?
aber nt gibts länger als delphi 6....
|
Re: CD Laufwerk öffen - Wo ist das Problem?
@vlees91
ne es muss schon ohne MCI Commands gehen. IOCTL_STORAGE_EJECT_MEDIA ist eine Konstante, auf der JEDI Page kannst du dir die winapi Headers ziehen und die JwaWinIoctl einbinden. Ich habe jetzt anstatt POverlapped mal TOverlapped probiert bzw. beides und beim Command bei tt zu @tt geändert. Jetzt kommt keine Zugrifssverletzung mehr, garnichts. Nur das Laufwerk öffnet sich immernoch nicht. Ich hab schon \\\\.\\PhysicalDrive0-3 probiert und \\\\.\\D: probiert oder nur D: nichts funzt. |
Re: CD Laufwerk öffen - Wo ist das Problem?
Zitat:
Hmm.. Dann hat Borland zu diesem Zeitpunkt die Konstanten für NT wohl nicht eingebaut... Interessant... D2005 kennt die Konstante jedenfalls.. //Edit: Äh... D2005 kennt die doch nicht... Dann hat Borland wohl nicht alle Konstanten aus'm PSDK übernommen.. |
Re: CD Laufwerk öffen - Wo ist das Problem?
Soo...
Delphi-Quellcode:
Das gibt schonmal ein gültiges Handle. Dein Code hat nämlich nichtmal ein gültiges Handle geliefert.
handle := CreateFile('\\.\I:',GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,NIL,OPEN_EXISTING,0,0);
|
Re: CD Laufwerk öffen - Wo ist das Problem?
Und zum dritten: :stupid:
Der funktionierende Code:
Delphi-Quellcode:
Es scheint an der vorletzten Konstante in CreateFile gelegen zu haben. Die war bei dir 0. Übrigens solltest du immer dein Handle auf Gültigkeit prüfen. Könnte man jetzt auch in eine hübsche Funktion verpacken.
const
IOCTL_STORAGE_EJECT_MEDIA = $2D4808; procedure TForm1.Button1Click(Sender: TObject); var Handle: THandle; n : DWord; begin Handle := CreateFile('\\.\I:',GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ or FILE_SHARE_WRITE, NIL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL or FILE_FLAG_NO_BUFFERING, 0); If Handle <> INVALID_HANDLE_VALUE then begin n := 0; DeviceIOControl(Handle, IOCTL_STORAGE_EJECT_MEDIA, NIL, 0, NIL, 0, n, NIL); CloseHandle(Handle); end; end; |
Re: CD Laufwerk öffen - Wo ist das Problem?
hi,
ahh Danke. Aber ich muss dich korrigieren. Der Fehler liegt am letzten Paramter von DeviceIOControl. Wenn man tt einfach nurch ne 0 ersetzt funzt das 1a. |
Re: CD Laufwerk öffen - Wo ist das Problem?
bei mir geht keines eurer codes
0 fehler, aber auch 0 offene laufwerke |
Re: CD Laufwerk öffen - Wo ist das Problem?
Hi:
hier nochmal de Code, der mit sicherheit funzt:
Delphi-Quellcode:
var
handle: THandle; test: PSecurityAttributes; back: Boolean; return: Cardinal; tt: POverlapped; begin handle := CreateFile('\\.\D:',GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,NIL,OPEN_EXISTING,0,0); back := DeviceIOControl(handle,IOCTL_STORAGE_EJECT_MEDIA,NIL,0,NIL,0,return,0); end; |
Re: CD Laufwerk öffen - Wo ist das Problem?
Du solltest das von CreateFile gelieferte Handle im Erfolgsfall aber wieder freigeben, so wie Daniel es in seinem Code gemacht hat.
Gruß Hawkeye |
Re: CD Laufwerk öffen - Wo ist das Problem?
hi, ok also hier komplett als Funktion:
Delphi-Quellcode:
function opendrive(driveletter: String): Boolean;
var hr:THandle; buffer: Cardinal; ret:Boolean; begin hr := CreateFile(PChar('\\.\'+driveletter+':'),GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,NIL,OPEN_EXISTING,0,0); if hr <> INVALID_HANDLE_VALUE then begin ret := DeviceIOControl(hr,IOCTL_STORAGE_EJECT_MEDIA,NIL,0,NIL,0,buffer,NIL); CloseHandle(hr); end; end; |
Re: CD Laufwerk öffen - Wo ist das Problem?
Zitat:
//EDIT: @skunker: Stimmt, der is' bei mir aber auch NIL... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:54 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