Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Array wird falschrum gefüllt (https://www.delphipraxis.net/3305-array-wird-falschrum-gefuellt.html)

Luckie 6. Mär 2003 05:02


Array wird falschrum gefüllt
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich werde noch mal wahnsinnig. Folgeder Code:
Delphi-Quellcode:
procedure THDDInfo.DumpDiskExtents;
var
  VolumePath  : String;
  hVolume     : cardinal;
  BytesWritten : DWORD;
  de          : VOLUME_DISK_EXTENTS;
  i, j        : Integer;
  TempArray    : TDiskNumArray;
begin
  FDiskNumbers := nil;
  setlength(FDiskNumbers, length(FPartitions));
  for i := 0 to length(FPartitions)-1 do
  begin
    VolumePath := '\\.\'+FPartitions[i]+':';
    hVolume := CreateFile(pointer(Volumepath), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
    if hVolume = INVALID_HANDLE_VALUE then
      exit;
    DeviceIOControl(hVolume, IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, nil, 0, @de, sizeof(de), BytesWritten, nil);
    for j := 0 to de.NumberOfDiskExtents-1 do
    begin
      FDiskNumbers[j] := de.extents[j].DiskNumber;
    end;
  end;
end;
Ich habe insgesammt 5 Partitionen (c bis f auf HDD0 und i auf HDD1) und beim Füllen des Arrays FDiskNumbers geht es schief. Er bekommt nach einander die Werte 0, 0, 0, 0, 1, also in der richtigen Reihenfolge wie es auch richtig ist.
Aber wenn ich nachher in das Array reinkucke, stehen sie genau umgekehrt drin, das heißt so: 1, 0, 0, 0, 0. :wall:
Aber die Reihenfolge ist natürlich wichtig, da ich auch ein Array mit den Laufwerksbuchstaben habe und das soll nachher wieder zusammenpassen logischerweise. :|
Die Compiler-Optimierung habe ich schon ausgeschaltet, hilft nichts. :roll:

Zum leichteren Debuggen habe ich das Projekt mal angehangen.

jbg 6. Mär 2003 06:16

Bei mir liefert er erstmal nur 0. Liegt aber auch daran, dass ich nur eine Platte im Rechner habe.

Was mir in deinem Quellcode allerdings abgeht sind die CloseHandle() aufrufe.

Luckie 6. Mär 2003 06:21

Ja, sind aber mittlerweile drin. Ich bin da hängen geblieben. Und das hat mich gewurmt wie noch was.

jbg 6. Mär 2003 16:06

Ich habe nun deinen Fehler gefunden:
Delphi-Quellcode:
    for j := 0 to de.NumberOfDiskExtents-1 do
    begin
      FDiskNumbers[j] := de.extents[j].DiskNumber;
    end;
Du wolltest wohl FDiskNumbers[i] schreiben. Denn so wie du es hast, ersetzt du immer nur FDiskNumbers[0] bei NumberOfDiskExtents=1.

Luckie 6. Mär 2003 16:16

Ahhh. Das war es. :hello: :bounce1:


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