![]() |
Union Übersetzung nach Pascal
Hi,
Auf Assabards Seite habe ich folgende Übersetzung gefunden
Code:
:arrow:
union {
struct { DWORD Signature; DWORD CheckSum; } Mbr; struct { GUID DiskId; } Gpt; };
Delphi-Quellcode:
Ok das ist nachvollziebar... ABER was ist soll das hier bedeuten:
case Integer of
0: ( Signature: DWORD; CheckSum: DWORD ); 1: ( DiskId: TGUID );
Code:
?
union {
PARTITION_INFORMATION_MBR Mbr; PARTITION_INFORMATION_GPT Gpt; };
Delphi-Quellcode:
... Aber was für einen Sinn ergibt das?
Case Integer of
0: PARTITION_INFORMATION_MBR; 1: PARTITION_INFORMATION_GPT; end; Gruß Neutral General |
Re: Union Übersetzung nach Pascal
Hi!
Es wäre wohl eher:
Delphi-Quellcode:
Viele Grüße,
case Integer of
0: (Mbr: PARTITION_INFORMATION_MBR); 1: (Gpt: PARTITION_INFORMATION_GPT); end; Chris Edit: Guck' mal ![]() |
Re: Union Übersetzung nach Pascal
Zitat:
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 |
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; |
Re: Union Übersetzung nach Pascal
Ok danke aber was heißt das hier:
Delphi-Quellcode:
Und wie soll ich die markierte Zeile in diesem Record übersetzen ? o.O
_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;
Code:
PS: Man man Michi -.- Erst gucken dann schreiben...
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] ? }
Delphi-Quellcode:
Gruß
PartitionEntry: array [0..0] of PARTITION_INFORMATION_EX;
Neutral General |
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:
über Pointer:
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); ...
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 |
Re: Union Übersetzung nach Pascal
Ok danke aber woher weiß ich wie viele Partitionen auf der Festplatte drauf sind ? o.O
|
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:
Im Grunde mach ich genau das Selbe ... oder bist du der Meinung, daß jemand mehr als 32 Partitionen auf einer Platte hat? (sehr unwarscheinlich)
DLI := GetMem(SizeOf(_DRIVE_LAYOUT_INFORMATION_EX)
+ SizeOf(_PARTITION_INFORMATION_EX) * 31); |
Re: Union Übersetzung nach Pascal
Also mein Problem liegt im Moment hauptsächlich bei GetMem^^
Delphi-Quellcode:
So ist das bei mir definiert. Und
procedure GetMem(var P: Pointer; Size: Integer);
Delphi-Quellcode:
funktioniert daher auch nicht so toll....
DLI := GetMem(SizeOf(_DRIVE_LAYOUT_INFORMATION_EX)
+ SizeOf(_PARTITION_INFORMATION_EX) * 31); EDIT: Ja ok.. man muss es ander schreiben...
Delphi-Quellcode:
Aber auf jeden Fall herzlichen Dank für die gute Hilfe :)
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); 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? |
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:
Und wie hast du dir eigentlich das Handle zur Partition geholt?
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz