咨询电话:010-82823766

如何将C/C++程序转译成Delphi(八)
  • 2007-12-26 14:57:40
  • 发表时间:
  • 浏览次数:
  • 不详
  • 文章来源:
  • 佚名
  • 作者:

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;

top
推荐导读
推荐导读
bottom
top
热门文章
热门文章
bottom