如何将C/C++程序转译成Delphi(八)
2006-02-04 13:31:49 来源:WEB开发网 闂傚倸鍊搁崐鎼佸磹閹间礁纾归柟闂寸绾惧綊鏌熼梻瀵割槮缁炬儳缍婇弻鐔兼⒒鐎靛壊妲紒鎯у⒔閹虫捇鈥旈崘顏佸亾閿濆簼绨绘い鎺嬪灪閵囧嫰骞囬姣挎捇鏌熸笟鍨妞ゎ偅绮撳畷鍗炍旈埀顒勭嵁婵犲嫮纾介柛灞捐壘閳ь剛鎳撻~婵嬪Ω閳轰胶鐤呯紓浣割儐椤戞瑩宕ョ€n喗鐓曟い鎰靛亝缁舵氨绱撻崘鈺傜婵﹤顭峰畷鎺戔枎閹搭厽袦婵犵數濮崑鎾绘⒑椤掆偓缁夌敻骞嗛悙鍝勭婵烇綆鍓欐俊鑲╃磼閹邦収娈滈柡灞糕偓鎰佸悑閹肩补鈧尙鏁栧┑鐐村灦閹稿摜绮旈悽绋课﹂柛鏇ㄥ灠閸愨偓濡炪倖鍔﹀鈧繛宀婁邯濮婅櫣绱掑Ο璇茶敿闂佺ǹ娴烽弫璇差嚕婵犳碍鏅插璺猴工瀹撳棝姊虹紒妯哄缂佷焦鎸冲畷鎴﹀箻鐠囧弶宓嶅銈嗘尰缁嬫垶绂嶉悙顒佸弿婵☆垳鍘ф禍楣冩倵濮樼偓瀚�

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;
更多精彩
赞助商链接