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 Laufwerk öffen - Wo ist das Problem? (https://www.delphipraxis.net/70776-cd-laufwerk-oeffen-wo-ist-das-problem.html)

skunker 4. Jun 2006 16:41


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

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.

vlees91 4. Jun 2006 16:44

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)
http://dsdt.info/tipps/?id=138

Hawkeye219 4. Jun 2006 16:48

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"

Daniel G 4. Jun 2006 16:49

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.

vlees91 4. Jun 2006 16:51

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

Daniel G 4. Jun 2006 16:55

Re: CD Laufwerk öffen - Wo ist das Problem?
 
Jupp, gibt's ja auch erst seit NT 4.0

Zitat:

Included in Windows XP, Windows 2000 Professional, and Windows NT Workstation 4.0.
IOCTL_STORAGE_EJECT_MEDIA = $002D4808;

vlees91 4. Jun 2006 16:57

Re: CD Laufwerk öffen - Wo ist das Problem?
 
aber nt gibts länger als delphi 6....

skunker 4. Jun 2006 16:59

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.

Daniel G 4. Jun 2006 17:03

Re: CD Laufwerk öffen - Wo ist das Problem?
 
Zitat:

Zitat von vlees91
aber nt gibts länger als delphi 6....

:gruebel:

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

Daniel G 4. Jun 2006 17:11

Re: CD Laufwerk öffen - Wo ist das Problem?
 
Soo...

Delphi-Quellcode:
handle := CreateFile('\\.\I:',GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,NIL,OPEN_EXISTING,0,0);
Das gibt schonmal ein gültiges Handle. Dein Code hat nämlich nichtmal ein gültiges Handle geliefert.

Daniel G 4. Jun 2006 17:25

Re: CD Laufwerk öffen - Wo ist das Problem?
 
Und zum dritten: :stupid:

Der funktionierende Code:

Delphi-Quellcode:
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;
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.

skunker 4. Jun 2006 17:35

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.

vlees91 4. Jun 2006 17:56

Re: CD Laufwerk öffen - Wo ist das Problem?
 
bei mir geht keines eurer codes
0 fehler, aber auch 0 offene laufwerke

skunker 4. Jun 2006 17:57

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;

Hawkeye219 4. Jun 2006 18:05

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

skunker 4. Jun 2006 18:09

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;

Daniel G 4. Jun 2006 18:22

Re: CD Laufwerk öffen - Wo ist das Problem?
 
Zitat:

Zitat von vlees91
bei mir geht keines eurer codes
0 fehler, aber auch 0 offene laufwerke

Welches OS?

//EDIT:
@skunker: Stimmt, der is' bei mir aber auch NIL...


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:53 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