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 QueryDosDevice = Path ist ungültig? (https://www.delphipraxis.net/154393-querydosdevice-%3D-path-ist-ungueltig.html)

Alter Mann 9. Sep 2010 09:35

QueryDosDevice = Path ist ungültig?
 
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

Bernhard Geyer 9. Sep 2010 10:45

AW: QueryDosDevice = Path ist ungültig?
 
Zitat:

Zitat von Alter Mann (Beitrag 1048366)
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)

Alter Mann 9. Sep 2010 19:41

AW: QueryDosDevice = Path ist ungültig?
 
Hallo Bernhard,

werde ich versuchen, das Problemkind ist jedoch QueryDosDevices.

Danke

Bernhard Geyer 9. Sep 2010 21:53

AW: QueryDosDevice = Path ist ungültig?
 
Dumm nur das obiger Quellcode kein QueryDosDevices beinhaltet:gruebel:

Morphie 10. Sep 2010 07:25

AW: QueryDosDevice = Path ist ungültig?
 
nicht?
Code:
if (QueryDosDevice(PChar(aVolumeRec.VolumeStr), VolumePathNames, BufferLength) > 0) then

Bernhard Geyer 10. Sep 2010 07:43

AW: QueryDosDevice = Path ist ungültig?
 
Zitat:

Zitat von Morphie (Beitrag 1048581)
nicht?

Du hast aber im letzten Post von QueryDosDevices geschrieben.
Und das habe ich mittels suche nicht gefuenden :-(

Alter Mann 10. Sep 2010 12:01

AW: QueryDosDevice = Path ist ungültig?
 
Okay ein s ist schuld:wink:

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


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