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

原创 2001年07月24日 13:31:00

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;

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

Conversion Tutorial Draft 4 27 JANUARY, 1998by Andreas Prucha Contents Anatomy of a C Header Convers...
  • mysine
  • mysine
  • 2001年07月24日 13:22
  • 616

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

2.2. Unit dependencies Back to contents -->C and C++ use #include to include header files in another...
  • mysine
  • mysine
  • 2001年07月24日 13:26
  • 690

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

5. Conditionals###ToDoBack to contents -->Back to contents 6. Functions6.1. BasicsLets use the follo...
  • mysine
  • mysine
  • 2001年07月24日 13:35
  • 606

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

7.2. Dynamic LinkingDynamic Linking is used to link the DLL at runtime.Handling Static and Dynamic L...
  • mysine
  • mysine
  • 2001年07月24日 13:45
  • 576

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

3.6.3. Packed Records (Alignment)If a record is packed (aligned) then the starting byte of a field (...
  • mysine
  • mysine
  • 2001年07月24日 13:33
  • 695

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

8. The Jedi Common Support Unit unit JediUtil;{=====================================================...
  • mysine
  • mysine
  • 2001年07月24日 13:45
  • 530

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

3.4. StringsIn C, as in Delphi, a string is an array of char types. Often, a string declaration is u...
  • mysine
  • mysine
  • 2001年07月24日 13:29
  • 596

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

. Anatomy of a C HeaderBack to contents -->Back to contents ## to do2. Conversion Basics Back to con...
  • mysine
  • mysine
  • 2001年07月24日 13:24
  • 618

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

1. Anatomy of a C HeaderBack to contents -->Back to contents ## to do2. Conversion Basics Back to co...
  • mysine
  • mysine
  • 2001年07月24日 13:28
  • 1091

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

7. LinkingThere are two ways to link a DLL and import a function. Static linking is very easy and th...
  • mysine
  • mysine
  • 2001年07月24日 13:39
  • 655
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何将C/C++程序转译成Delphi(八)
举报原因:
原因补充:

(最多只允许输入30个字)