Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Laufwerksbuchstaben aus device-name ermitteln (https://www.delphipraxis.net/96556-laufwerksbuchstaben-aus-device-name-ermitteln.html)

Gerd01 26. Jul 2007 16:28


Laufwerksbuchstaben aus device-name ermitteln
 
Hallo Leute,

wie kann ich aus einem device-namen ( Beispiel: /device/cdrom0 für das erste CD-Laufwerk) den Laufwerksbuchstaben ( D:/ oder E:/ etc ) ermitteln? Welche API-Funktion gibts dazu? Die Funktion QueryDosDevice gibts ja. Nur halt für die Ermittlung des device-namens aus dem Laufwerksbuchstaben.

Gruß Gerd

Robert Marquardt 26. Jul 2007 17:09

Re: Laufwerksbuchstaben aus device-name ermitteln
 
Gibt es das /device/cdrom0 ueberhaupt?

Reinhard Kern 26. Jul 2007 19:16

Re: Laufwerksbuchstaben aus device-name ermitteln
 
Zitat:

Zitat von Gerd01
Hallo Leute,

wie kann ich aus einem device-namen ( Beispiel: /device/cdrom0 für das erste CD-Laufwerk) den Laufwerksbuchstaben ( D:/ oder E:/ etc ) ermitteln? Welche API-Funktion gibts dazu? Die Funktion QueryDosDevice gibts ja. Nur halt für die Ermittlung des device-namens aus dem Laufwerksbuchstaben.

Gruß Gerd

Dann ist die Umkehrung ja kein Problem: einfach C bis Z abfragen, ob der Device-Name der gesuchte ist. Ob es einen direkteren Weg gibt, weiss ich im Moment auch nicht auswendig.

Gruss Reinhard

Gerd01 26. Jul 2007 19:29

Re: Laufwerksbuchstaben aus device-name ermitteln
 
Zitat:

Zitat von Robert Marquardt
Gibt es das /device/cdrom0 ueberhaupt?

Ja sicher es gibt auch /device/cdrom1 und weitere wenn du mehrere CD_laufwerke hast.

Ich habe mitllerweile eine Funktion gefunden.

Delphi-Quellcode:
function GetDosDevice(CDDriveID:integer):string;
var
  Buffer : array[0..500] of char;
  TmpPC : PChar;
  CdCtr:integer ;
begin
  CdCtr := 0 ;
  result := '';
  GetLogicalDriveStrings(SizeOf(Buffer),Buffer);
  TmpPC := Buffer;
   while TmpPC[0] <> #0 do begin
    if Windows.GetDriveType(TmpPC) = DRIVE_CDROM then
        begin
         if CdCtr = CdDriveId then
           begin
             result := TmpPC;
             exit;
           end;
           CdCtr := CdCtr+1;
        end ;
    TmpPC := StrEnd(TmpPC)+1;
   end;
end;
Mit:
Var
Last : Char;
LW : String;

und
LW := '/device/cdrom0';
Last := LW[Length(LW)];
LW := GetDosDevice(StrToIntDef(LW,0));

hole ich LW die Laufwerk bzw CD-ROM Bezeichnung.

hathor 26. Jul 2007 23:07

Re: Laufwerksbuchstaben aus device-name ermitteln
 
Es geht auch so:
Delphi-Quellcode:
Function GetCDROM:string;
var DriveType, i: integer;
     LW, Drive : String;
begin
  i := 1;
  LW := 'cdrom0';
  repeat
  Drive:= Chr(i+64);
  DriveType := GetDriveType(PChar(Format('%S:\',[Drive]))) ;
  if DriveType=5 then
  Begin
    result:= GetDosDevice(StrToIntDef(LW,0));
    break;
  end;
    inc (i);
  until i=27;
end;

Olli 27. Jul 2007 07:11

Re: Laufwerksbuchstaben aus device-name ermitteln
 
Wie steht's mit session-lokalen Gerätenamen (und Laufwerksbuchstaben)? :stupid:

Zitat:

Zitat von Gerd01
Zitat:

Zitat von Robert Marquardt
Gibt es das /device/cdrom0 ueberhaupt?

Ja sicher es gibt auch /device/cdrom1 und weitere wenn du mehrere CD_laufwerke hast.

Soso und in welchem Namensraum ist das? Sieht ein bißchen linuxig aus, ist aber nicht Cygwin oder SFU. Robert's Frage hat hier durchaus ihre Berechtigung und Reinhard hat den korrekten Weg aufgezeigt. Von Win32 aus kannst du ohnehin nur implizit über DefineDosDevice() mit dem Flag DDD_RAW_TARGET_PATH auf das Objektverzeichnis \Device zugreifen. Ich vermute mal, daß es das ist was du meinst. Sonst bleibt für dich nur auf \??\CdRomX (was üblicherweise automatisch vom System angelegt wird und auf das entsprechende \Device\CdRomX zeigt) zuzugreifen.

Ansonsten ist das Anliegen an sich schon ... nunja ... fragwürdig, weil nämlich der Gerätename (\Device\*) immer eindeutig ist, ein Laufwerksbuchstabe hingegen nicht. Bei einem System mit 2 Festplatten und einem CD-ROM-Laufwerk kann ich bspw. auch, nachdem C: und D: für die Partitionen vergeben sind, die Laufwerksbuchstaben E: bis Z: für das (gleiche!) CD-ROM-Laufwerk vergeben. Mag zwar seltsam klingen, ist aber gut und gern möglich und vor allem vollkommmen legitim!

Die Funktion GetDosDevice() wie oben dargestellt wird übrigens schon auf einem "normalen" System (wo man ein 1:1-Mapping hat) nicht immer funktionieren, weil man nämlich auch dort die Buchstaben in einer anderen Reihenfolge als in welcher die Geräte logisch beim "Gerätemanager" angemeldet wurden auf Laufwerksbuchstaben mappen kann. Laufwerk R: kann gut und gerne auf \Device\CdRom3 verweisen, während U: bis W: auf \Device\CdRom0 bis \Device\CdRom2 verweisen. Was dann? Die o.g. Funktion GetDosDevice() baut dann mal eben Mist. Abgesehen davon kann man bestimmte CD-Laufwerke auch entfernen, so daß CdRom0 nicht immer das erste gültige Gerät in einem laufenden System sein muß.

Ich würde dringend empfehlen mal WinObj von Sysinternals runterzuladen und dort mal ein wenig durch den Namensraum des NT-Objektmanagers browsen, damit du ein Gefühl dafür bekommst was eigentlich so unter der Haube los ist.

Gerd01 28. Jul 2007 12:33

Re: Laufwerksbuchstaben aus device-name ermitteln
 
Hallo Olli,

nun mal nicht so von oben herab. :roll: Etwas kenne ich mich schon aus. Die Device-Bezeichnung ist nicht "linux-lastig" sondern wird vom XP-Betriebsystem von Microsoft geliefert und die sind ja bekanntlich nicht so "linux-lastig". :lol:

Nun zur Sache damit du auch weisst warum ich die Frage stellte.

Wenn du die Betriebssystemschnittstelle (Imapi, nicht mit mapi verwechseln!) unter XP zum Brennen nutzt, dann mit IEnumDiscRecorders die Eigenschaften des Brenners abfragst dann kommt in getpath halt als Antwort /device/cdrom0 oder /device/cdrom1 etc bei mehrerer Brennern. Also meine Frage hatte schon einen Hintergrund. Wen das Handling der Imapi-Schnittstelle unter Delphi interessiert möge sich bei mir melden. Ich habe weitergehende Informationen.

Gruß Gerd.

Alter Mann 28. Jul 2007 12:53

Re: Laufwerksbuchstaben aus device-name ermitteln
 
Hallo Gerd01,

wenn Du statt GetPath GetDisplayName nimmst,
kannst Du anschließend mit WMI Win32_CDROMDRIVE
den Laufwerksbuchstaben herausbekommen.

Dein Angebot zu IMAPI ist angenommen.

Gruß

Gerd01 28. Jul 2007 13:04

Re: Laufwerksbuchstaben aus device-name ermitteln
 
Hier die Info-Links zu imapi. Ich habe mit diesen Informationen eine ganz brauchbare Brennfunktion in meinem Delphi-Programm implementiert.

Eine sehr gute Beschreibung mit Beispielcode findet du hier (Entwickler): http://derentwickler.de/itr/online_a...nodeid,56.html . Den Beispielcode findet du auf der Page unter Links und Literatur.

Siehe auch hier: http://www.uaconsulting.de/de/downlo...tm#sourcecodes

Eine weitere Komponente (TXPBurn) findest du hier: http://www.bayden.com/delphi/xpburn.htm

Alter Mann 28. Jul 2007 13:22

Re: Laufwerksbuchstaben aus device-name ermitteln
 
Liste der Anhänge anzeigen (Anzahl: 1)
Gerd01

Den Artikel von Bernd Ua kenne ich, hatte mir das Heft gekauft.
TXPBurn werden ich mir anschauen.

Danke und Gruß

[Edit]
Ich habe mal ein kleines Prog angefügt.
In die Editbox kommt der DisplayName und mit ein bischen Glück
wird der Laufwerksbuchstabe zurückgegeben.
Läuft nur auf dem lokalen Windows-XP Rechner!
[/Edit]


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:12 Uhr.
Seite 1 von 2  1 2   

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