Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Union Übersetzung nach Pascal (https://www.delphipraxis.net/88246-union-uebersetzung-nach-pascal.html)

Neutral General 12. Mär 2007 15:04


Union Übersetzung nach Pascal
 
Hi,

Auf Assabards Seite habe ich folgende Übersetzung gefunden


Code:
union {
    struct {
      DWORD Signature;
      DWORD CheckSum;
    } Mbr;
    struct {
      GUID DiskId;
    } Gpt;
  };
:arrow:

Delphi-Quellcode:
case Integer of
    0: (
       Signature: DWORD;
       CheckSum: DWORD
       );
    1: (
       DiskId: TGUID
       );
Ok das ist nachvollziebar... ABER was ist soll das hier bedeuten:

Code:
union {
        PARTITION_INFORMATION_MBR Mbr;
        PARTITION_INFORMATION_GPT Gpt;
    };
?

Delphi-Quellcode:
Case Integer of
 0: PARTITION_INFORMATION_MBR;
 1: PARTITION_INFORMATION_GPT;
end;
... Aber was für einen Sinn ergibt das?

Gruß
Neutral General

CK_CK 12. Mär 2007 15:08

Re: Union Übersetzung nach Pascal
 
Hi!
Es wäre wohl eher:
Delphi-Quellcode:
case Integer of
  0: (Mbr: PARTITION_INFORMATION_MBR);
  1: (Gpt: PARTITION_INFORMATION_GPT);
end;
Viele Grüße,
Chris

Edit: Guck' mal [HIER], wie die's gelöst haben... ;)

Neutral General 12. Mär 2007 15:19

Re: Union Übersetzung nach Pascal
 
Zitat:

Zitat von CK_CK
Edit: Guck' mal [HIER], wie die's gelöst haben... ;)

--------- __________ -----------

Die Schweine. Das wollte ich doch machen :roll:

Pf.. Ich machs trotzdem -.-

PS: Danke ;)
PPS: Wobei das Problem auch noch bei ULong64 liegt.. Die benutzen da ein DWORD64. Sowas existiert bei mir aber nicht..
PPPS: Ich seh grad die definieren ULong64 als Int64... Ehm naja ich weiß zwar nicht seit wann Integers unsigned sind aber egal :wall:

Gruß
Neutral General

himitsu 12. Mär 2007 15:26

Re: Union Übersetzung nach Pascal
 
Delphi-Quellcode:
// ab Delphi 6:
Type DWord64 = System.UInt64;
   LargeWord = System.UInt64;


// und D1 bis D5:
Type DWord64 = Type System.Int64;
   LargeWord = Type System.Int64;

Neutral General 12. Mär 2007 15:53

Re: Union Übersetzung nach Pascal
 
Ok danke aber was heißt das hier:

Delphi-Quellcode:
_PARTITION_INFORMATION_EX = record
  PartitionStyle: PARTITION_STYLE;
  StartingOffset: LARGE_INTEGER;
  PartitionLength: LARGE_INTEGER;
  PartitionNumber: ULONG;
  RewritePartition: Boolean;
  case Integer of
    0: (Mbr: PARTITION_INFORMATION_MBR);
    1: (Gpt: PARTITION_INFORMATION_GPT);
end;
Und wie soll ich die markierte Zeile in diesem Record übersetzen ? o.O

Code:
typedef struct _DRIVE_LAYOUT_INFORMATION_EX {
    ULONG PartitionStyle;
    ULONG PartitionCount;
    union {
        DRIVE_LAYOUT_INFORMATION_MBR Mbr;
        DRIVE_LAYOUT_INFORMATION_GPT Gpt;
    };
    PARTITION_INFORMATION_EX PartitionEntry[1]; //<---- Was soll die [1] ?
}
PS: Man man Michi -.- Erst gucken dann schreiben...

Delphi-Quellcode:
PartitionEntry: array [0..0] of PARTITION_INFORMATION_EX;
Gruß
Neutral General

himitsu 12. Mär 2007 16:05

Re: Union Übersetzung nach Pascal
 
Aber vergiß dann nicht vorher abzufragen wieviele Partitionen vorhanden sind, denn du mußt ja mindestens für jede Partition da hinten Speicherplatz reservieren.


Da ich selber ums mir einfacher zu machen und Delphi die Verwaltung des Speicherplatzes aufzubrumen gerne Variablen verwende, hab ich das einfach so gelöst :angel:

mit Variable:
Delphi-Quellcode:
Type _DRIVE_LAYOUT_INFORMATION_EX = packed Record
    PartitionStyle: _PARTITION_STYLE;
    PartitionCount: LongWord;
    Union: packed Record Case _PARTITION_STYLE of
      PARTITION_STYLE_MBR: (Mbr: _DRIVE_LAYOUT_INFORMATION_MBR);
      PARTITION_STYLE_GPT: (Gpt: _DRIVE_LAYOUT_INFORMATION_GPT);
    End;
    PartitionEntry: packed Array[0..31] of _PARTITION_INFORMATION_EX;
  End;

Var DLI: _DRIVE_LAYOUT_INFORMATION_EX;

DeviceIoControl(Dh, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, nil, 0,
  @DLI, SizeOf(_DRIVE_LAYOUT_INFORMATION_EX), W, nil);
...
über Pointer:
Delphi-Quellcode:
Type _DRIVE_LAYOUT_INFORMATION_EX = packed Record
    PartitionStyle: _PARTITION_STYLE;
    PartitionCount: LongWord;
    Union: packed Record Case _PARTITION_STYLE of
      PARTITION_STYLE_MBR: (Mbr: _DRIVE_LAYOUT_INFORMATION_MBR);
      PARTITION_STYLE_GPT: (Gpt: _DRIVE_LAYOUT_INFORMATION_GPT);
    End;
    PartitionEntry: packed Array[0..0] of _PARTITION_INFORMATION_EX;
  End;
  pDRIVE_LAYOUT_INFORMATION_EX = _DRIVE_LAYOUT_INFORMATION_EX^;

Var pDLI: pDRIVE_LAYOUT_INFORMATION_EX;

DLI := GetMem(SizeOf(_DRIVE_LAYOUT_INFORMATION_EX)
  + SizeOf(_PARTITION_INFORMATION_EX) * (AnzahlDerPartitionen - 1));
Try
  DeviceIoControl(Dh, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, nil, 0,
    DLI, SizeOf(_DRIVE_LAYOUT_INFORMATION_EX), W, nil);
  ...
Finally
  FreeMem(DLI);
End;

// -1 da Array[0..0] of _PARTITION_INFORMATION_EX bereits einmal _PARTITION_INFORMATION_EX einschließt

Neutral General 12. Mär 2007 16:16

Re: Union Übersetzung nach Pascal
 
Ok danke aber woher weiß ich wie viele Partitionen auf der Festplatte drauf sind ? o.O

himitsu 12. Mär 2007 16:22

Re: Union Übersetzung nach Pascal
 
von nirgendwo?

na ja, im Grunde machen es alle einfach so ... sie reservieren mehr, als es vermutlich gibt :zwinker:
und lassen sich dann im Nachhinein überraschen was in PartitionCount steht.

also meist einfach:
Delphi-Quellcode:
DLI := GetMem(SizeOf(_DRIVE_LAYOUT_INFORMATION_EX)
  + SizeOf(_PARTITION_INFORMATION_EX) * 31);
Im Grunde mach ich genau das Selbe ... oder bist du der Meinung, daß jemand mehr als 32 Partitionen auf einer Platte hat? (sehr unwarscheinlich)

Neutral General 12. Mär 2007 16:36

Re: Union Übersetzung nach Pascal
 
Also mein Problem liegt im Moment hauptsächlich bei GetMem^^

Delphi-Quellcode:
procedure GetMem(var P: Pointer; Size: Integer);
So ist das bei mir definiert. Und
Delphi-Quellcode:
DLI := GetMem(SizeOf(_DRIVE_LAYOUT_INFORMATION_EX)
  + SizeOf(_PARTITION_INFORMATION_EX) * 31);
funktioniert daher auch nicht so toll....

EDIT: Ja ok.. man muss es ander schreiben...

Delphi-Quellcode:
Size := SizeOf(_DRIVE_LAYOUT_INFORMATION_EX) + SizeOf(_PARTITION_INFORMATION_EX)*31;

GetMem(P,Size);
DeviceIoControl(H,IOCTL_DISK_GET_DRIVE_LAYOUT_EX,nil,0,P,Size,OutBytes,nil)
FreeMem(P);
Aber auf jeden Fall herzlichen Dank für die gute Hilfe :)

Gruß
Neutral General


EDIT: Oh man... Ich bekomme jetzt als P.PartitionCount 32 zurück..... Damit kann ich ja gar nix anfangen und P.ParitionEntry[0].PartitionNumber ist 288.. Kann das sein?

himitsu 12. Mär 2007 17:27

Re: Union Übersetzung nach Pascal
 
tja, das kommt wohl von den vielen Varianten -.-''

P := GetMemory(Size);
GetMem(P, Size);
P := SysGetMem(Size);
...

wobei GetMem eine Exception (EOutOfMemory) auslößt, wenn der gewpnschte Speicher nicht reserviert werden kann und die Anderen "nur" P=nil zurückliefern (also ohne Exception).


Was gibt DeviceIoControl für'n Fehler aus?
(bei 'nem Fehler wird nichts in den Record geschrieben, daher könnten auch die "komischen" Werte kommen ... standen halt vorher schon so drin)
Delphi-Quellcode:
Size := SizeOf(_DRIVE_LAYOUT_INFORMATION_EX) + SizeOf(_PARTITION_INFORMATION_EX) * 31;
GetMem(P, Size);
Try
  FillChar(P^, Size, 0);
  If DeviceIoControl(H, IOCTL_DISK_GET_DRIVE_LAYOUT_EX, nil, 0,
    P, Size, OutBytes, nil) Then Begin
   
    ...

  End Else ShowMessage(SysErrorMessage(GetLastError));
Finally
  FreeMem(P);
End;
Und wie hast du dir eigentlich das Handle zur Partition geholt?


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:39 Uhr.
Seite 1 von 3  1 23      

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