3.6. Structures, Records
3.6.1. Simple Structures
C structures are similar to records in Delphi. Structures are usually defined with the typedef keyword, but it's also possible to do it with #define.
The format of a structure declaration is
{Struct|Union} [OptIdentifier] [TagName]
{ FieldDefinitions [; ...]}
[Name [...]]
You can ignore the TagName. It's used in C for subsequent references to the structure.
This is how the fields within a structure are defined:
#define RASENTRYNAMEA struct tagRASENTRYNAMEA
RASENTRYNAMEA
{
DWORD dwSize;
CHAR szEntryName[ RAS_MaxEntryName + 1 ];
};
This C declaration defines a record (structure) named RASENTRYNAMEA. The Delphi-style name would be TRASENTRYNAMEA. This structure contains two fields: the first is named dwSize and has the type DWord. The second field is an array of char with RAS_MaxEntryName + 1 elements.
The Delphi translation:
TYPE
PRASEntryName = ^TRASEntryName
TRASEntryName = Record
dwSize : DWORD;
szEntryName : Array [0..RAS_MaxEntryName] of Char
end
Remember, you may not declare the array of char with a range from 0 to RAS_MaxEntryName+1. The reason is, that in C the number of elements is specified, but in Delphi the range of elements. Read more in the chapters about Arrays and Strings.
3.6.2 Unions in Structures
C unions in structures are comparable to variant parts of records in Delphi. Blocks declared in a union structure are not consecutive but overlaid.
typedef struct _PROCESS_HEAP_ENTRY {
PVOID lpData;
DWORD cbData;
BYTE cbOverhead;
BYTE iRegionIndex;
WORD wFlags;
union {
struct {
HANDLE hMem;
DWORD dwReserved[ 3 ];
} Block;
struct {
DWORD dwCommittedSize;
DWORD dwUnCommittedSize;
LPVOID lpFirstBlock;
LPVOID lpLastBlock;
} Region;
};
} PROCESS_HEAP_ENTRY, *LPPROCESS_HEAP_ENTRY, *PPROCESS_HEAP_ENTRY;
This is the translation into Delphi:
type
PProcessHeapEntry = ^TProcessHeapEntry;
TProcessHeapEntry = Record
lpData: Pointer;
cbData: DWord;
cbOverhead: Byte;
iRegionIndex: Byte;
wFlags: Word;
case Integer of
0: (Block: Record
hMem: Thandle
Reserved : Array [0..2] of DWord;
end);
1: (Region: Record
dwCommittedSize: DWord;
dwUnCommittedSize: DWord;
lpFirstBlock: Pointer;
lpLastBlock: Pointer
end);
end;