AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi QueryDosDevice = Path ist ungültig?
Thema durchsuchen
Ansicht
Themen-Optionen

QueryDosDevice = Path ist ungültig?

Ein Thema von Alter Mann · begonnen am 9. Sep 2010 · letzter Beitrag vom 10. Sep 2010
Antwort Antwort
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

QueryDosDevice = Path ist ungültig?

  Alt 9. Sep 2010, 09:35
Hallo,

ich kämpfe mal wieder mit WinAPI Delphi 7

Folgendes ist gegeben:
Delphi-Quellcode:
...
type
  TVolumeRec = record
    DeviceStr : String;
    VolumeStr : String;
    PathStr : String;
  end;
...
procedure SplitVolumeNames(aVolume : Array of Char; var aVolumeRec : TVolumeRec);
var
  BufferLength,
  ReturnLength : DWORD;
  VolumePathNames : PChar;

begin
  BufferLength := MAX_PATH + 1;

  aVolumeRec.VolumeStr := Copy(aVolume, 1, BufferLength);
  VolumePathNames := StrAlloc(BufferLength);
  if GetVolumePathNamesForVolumeName(PChar(aVolumeRec.VolumeStr), VolumePathNames, BufferLength, ReturnLength) then
    aVolumeRec.PathStr := StrPas(VolumePathNames);
  StrDispose(VolumePathNames);

  VolumePathNames := StrAlloc(BufferLength);
  if (QueryDosDevice(PChar(aVolumeRec.VolumeStr), VolumePathNames, BufferLength) > 0) then
  aVolumeRec.DeviceStr := VolumePathNames
  else
  ErrorDesc(GetLastError);
  StrDispose(VolumePathNames);
end;

function GetVolumes(var aVolumeRecList : TVolumeRecList) : Boolean;
var
  hVolume : THandle;
  nVolume : Array[0..MAX_PATH] of Char;
  I : Integer;
begin
  I := 0;
  hVolume := FindFirstVolume(nVolume, SizeOf(nVolume));
  if hVolume <> INVALID_HANDLE_VALUE then
  repeat
    SplitVolumeNames(nVolume, aVolumeRecList[I]);
    Inc(I);
  until not FindNextVolume(hVolume, nVolume, SizeOf(nVolume));
  FindVolumeClose(hVolume);
  SetLength(aVolumeRecList, I);
  Result := Length(aVolumeRecList) > 0;
end;
Es geht bist auf die Tatsache, das QueryDosDevice immer den Fehler zurück gibt:
Zitat:
Der angegebene Pfadname ist ungültig.
Der vorhergehende Aufruf von GetVolumePathNamesForVolumeName liefert jedoch den
korrekten Wert: 'E:\'.

Hat jemand einen Tipp?

Ach so, über gebe ich bei GetVolumePathNamesForVolumeName das Ziel so:
Delphi-Quellcode:
var
  VolumePathNames : String;
begin
  if GetVolumePathNamesForVolumeName(PChar(aVolumeRec.VolumeStr),
                                     @VolumePathNames[1],
                                     BufferLength, ReturnLength) then
    aVolumeRec.PathStr := VolumePathNames;
Kommt es zu einer ZV.

Danke
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: QueryDosDevice = Path ist ungültig?

  Alt 9. Sep 2010, 10:45
Ach so, über gebe ich bei GetVolumePathNamesForVolumeName das Ziel so:
Delphi-Quellcode:
var
  VolumePathNames : String;
begin
  if GetVolumePathNamesForVolumeName(PChar(aVolumeRec.VolumeStr),
                                     @VolumePathNames[1],
                                     BufferLength, ReturnLength) then
    aVolumeRec.PathStr := VolumePathNames;
Kommt es zu einer ZV.

Danke
Der zweite Parameter erwartet einen ausreichend großen Buffer in der das Ergebnis geschrieben wird. @ auf einen String hast du den nicht!

Probier mal:

Delphi-Quellcode:
var
  buffer: array[0...4096] of char;
begin
 ...
  GetVolumePathNamesForVolumeName(PChar(aVolumeRec.VolumeStr),
                                     @buffer,
                                     SizeOf(buffer) div SizeOf(char), ReturnLength)
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: QueryDosDevice = Path ist ungültig?

  Alt 9. Sep 2010, 19:41
Hallo Bernhard,

werde ich versuchen, das Problemkind ist jedoch QueryDosDevices.

Danke
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: QueryDosDevice = Path ist ungültig?

  Alt 9. Sep 2010, 21:53
Dumm nur das obiger Quellcode kein QueryDosDevices beinhaltet
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Morphie

Registriert seit: 27. Apr 2008
Ort: Rahden
630 Beiträge
 
#5

AW: QueryDosDevice = Path ist ungültig?

  Alt 10. Sep 2010, 07:25
nicht?
Code:
if (QueryDosDevice(PChar(aVolumeRec.VolumeStr), VolumePathNames, BufferLength) > 0) then
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: QueryDosDevice = Path ist ungültig?

  Alt 10. Sep 2010, 07:43
Du hast aber im letzten Post von QueryDosDevices geschrieben.
Und das habe ich mittels suche nicht gefuenden
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
934 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: QueryDosDevice = Path ist ungültig?

  Alt 10. Sep 2010, 12:01
Okay ein s ist schuld

Ich habe den Code mal ein wenig geändert.
Was mich verwirrt ist die Tatsache das mit einem Laufwerksbuchstaben geht und mit einer GUID nicht
Delphi-Quellcode:
procedure SplitVolumeNames(aVolume : Array of Char; var aVolumeRec : TVolumeRec);
var
  BufferLength,
  ReturnLength : DWORD;
  VolumePathNames : TCharArray;

begin
  BufferLength := MAX_PATH + 1;

  aVolumeRec.VolumeStr := Copy(aVolume, 1, BufferLength);
  FillChar(VolumePathNames, SizeOf(TCharArray), #0);
  if GetVolumePathNamesForVolumeName(aVolume, VolumePathNames, BufferLength, ReturnLength) then
    aVolumeRec.PathStr := StrPas(VolumePathNames);


  FillChar(VolumePathNames, SizeOf(TCharArray), #0);
  if (QueryDosDevice(PChar(Copy(aVolumeRec.PathStr, 1, 2)), VolumePathNames, BufferLength) > 0) then
  aVolumeRec.DeviceStr := VolumePathNames
  else
  ErrorDesc(GetLastError);

end;
aVolumeRec.PathStr = 'E:\' liefert das richtige Ergebnis: '\Device\HarddiskVolume1'.
Übergebe ich jedoch die passende GIUD: '\\?\Volume{5bc8c923-ba57-11de-b195-005056c00008}\'; Kommt
die Fehlermeldung: Der angegebene Pfadname ist ungültig.

Kann mir einer sagen warum das so ist, habe ich etwas übersehen?

Danke
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:02 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