咨询电话:010-82823766

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

3.4. Strings

In C, as in Delphi, a string is an array of char types. Often, a string declaration is used in combination with a constant declaration specifying the maximum string length, as the following example shows:

#define RAS_MaxEntryName 256







#define RASENTRYNAMEA struct tagRASENTRYNAMEA







RASENTRYNAMEA







{







  DWORD dwSize;







  CHAR szEntryName[ RAS_MaxEntryName + 1 ];







};

The first line declares a constant RAS_MaxEntryName with the value 256 specifying the maximum length of the string. The lines after it declare a struct (record) which contains a null-terminated string:

CHAR szEntryName[ RAS_MaxEntryName + 1 ];

The Delphi translation:

szEntryName : Array [0..RAS_MaxEntryName] of Char;

Why not Array [0..RAS_MaxEntryName+1] of Char? Recall that a C array starts with 0 and the declaration specifies the number of elements. Thus, Array [0..RAS_MaxEntryName+1] in Delphi is equivalent to [RAS_MaxEntryName+2] in C.


Back to contents

3.5. Enumerations - Two Methods

Enumerated types can be translated in two ways.

Method 1:

typedef enum _FINDEX_INFO_LEVELS {







FindExInfoStandard,







FindExInfoMaxInfoLevel







} FINDEX_INFO_LEVELS;

This part of a C-header file translates easily to Delphi:

Type







  TFindExInfoLevels = (FindExInfoStandard, 







                       FindExInfoMaxInfoLevel);

The ordinal Value of the item FindExInfoStandard is 0. In Delphi each enumeration starts with 0.

Method 2:

The following C-declaration is more problematic:

typedef enum _ACL_INFORMATION_CLASS {







AclRevisionInformation = 1,







AclSizeInformation







} ACL_INFORMATION_CLASS

The "= 1" in the declaration forces C to start with the ordinal value 1. This is not possible in Delphi.

There are two ways to solve the problem.

Solution a): Declare the enumeration as

TACLInformationClass = (_Fill0, 







                        AclRevisionInformation, 







                        AclSizeInformation);

Solution b): Translate the enumeration as

CONST







  AclRevisionInformation = 1;







  AclSizeInformation = 2;















TYPE







  TACLInformationClass = DWord;

That's no problem for this example. But in C it's possible to specify the ordinal value of each item of the enumeration, for example:

Typedef enum _ENUMEXAMPLE { 







  Item1 = 5,







  Item2 = 10,







} ENUMEXAMPLE;

Using enumeration in Delphi the declaration would have to be done like this:

TEnumExample = (_Fill0, 







                _Fill1, 







                _Fill2, 







                _Fill3, 







                _Fill4, 







                Item1, 







                _Fill6, 







                _Fill7, 







                _Fill8, 







                _Fill9, 







                Item2);

This is hard to read and clumsy to maintain.

This works better:




CONST







  Item1 = 5;







  Item2 = 10;















TYPE







  TEnumExample = DWord;


Back to contents

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