如何将C/C++程序转译成Delphi(八)
2006-02-04 13:31:49 来源:WEB开发网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 tagRASENTRYNAMEARASENTRYNAMEA{ 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.
Back to contents
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;
更多精彩
赞助商链接