Einzelnen Beitrag anzeigen

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