如何将C/C++程序转译成Delphi(八)

类别:Delphi 点击:0 评论:0 推荐:

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.


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;

本文地址:http://com.8s8s.com/it/it6025.htm