1、如何将如何将 C 语言程序转译成语言程序转译成 delphi 语言程序语言程序 目录 Delphi 指针与 C 指针区别 2 一、类型指针的定义。2 二、无类型指针的定义。2 三、指针的解除引用。2 四、取地址(指针赋值)。3 五、指针运算。3 六、动态内存分配。3 七、字符数组的运算。4 八、函数指针。4 九.数据类型对照表 5 十.关键字对照表 6 如何将 C/C+程序转译成 Delphi 8 1 c头文件分解 8 2 基本转换 8 2.1 名字 8 2.2 单元附属 8 2.3#defines 和 constants 9 3 数据类型 9 3.1 基本数据类型 9 3.2 winapi
2、公共类型 10 3.3数组 11 3.4 字符串 11 3.5枚举类型:11 3.6 结构、记录 12 4.宏命令 15 5 条件句 16 6 函数 16 6.1 基本的 16 6.2 调用约定 16 7.连接 17 7.1 静态链接 17 7.2 动态链接 18 8 公共支持单元 20 Delphi 指针与指针与 C 指针区别指针区别 大家都认为,C 语言之所以强大,以及其自由性,很大部分体现在其灵活的指针运用上。因此,说指针是 C 语言的灵魂,一点都不为过。同时,这种说法也让很多人产生误解,似乎只有 C 语言的指针才能算指针。Basic不支持指针,在此不论。其实,Pascal 语言本身也是
3、支持指针的。从最初的 Pascal 发展至今的 Object Pascal,可以说在指针运用上,丝毫不会逊色于 C 语言的指针。以下内容分为八个部分,分别是 一、类型指针的定义 二、无类型指针的定义 三、指针的解除引用 四、取地址(指针赋值)五、指针运算 六、动态内存分配 七、字符数组的运算 八、函数指针 九、数据类型对照表 十、关键字对照表 一、类型指针的定义。一、类型指针的定义。对于指向特定类型的指针,在 C 中是这样定义的:int*ptr;char*ptr;与之等价的 Object Pascal 是如何定义的呢?var ptr:Integer;ptr:char;其实也就是符号的差别而已。
4、二、无类型指针的定义。二、无类型指针的定义。C 中有 void*类型,也就是可以指向任何类型数据的指针。Object Pascal 为其定义了一个专门的类型:Pointer。于是,ptr:Pointer;就与 C 中的 void*ptr;等价了。三、指针的解除引用。三、指针的解除引用。要解除指针引用(即取出指针所指区域的值),C 的语法是(*ptr),Object Pascal则是 ptr。四、取地址(指针赋值)。四、取地址(指针赋值)。取某对象的地址并将其赋值给指针变量,C 的语法是 ptr=&Object;Object Pascal 则是 ptr:=Object;也只是符号的差别而已。五、
5、指针运算。五、指针运算。在 C 中,可以对指针进行移动的运算,如:char a20;char*ptr=a;ptr+;ptr+=2;当执行 ptr+;时,编译器会产生让 ptr前进 sizeof(char)步长的代码,之后,ptr将指向 a1。ptr+=2;这句使得 ptr前进两个 sizeof(char)大小的步长。同样,我们来看一下Object Pascal 中如何实现:var a:array 1.20 of Char;ptr:PChar;/PChar 可以看作 Char begin ptr:=a;Inc(ptr);/这句等价于 C 的 ptr+;Inc(ptr,2);/这句等价于 C 的
6、ptr+=2;end;六、动态内存分配。六、动态内存分配。C 中,使用 malloc()库函数分配内存,free()函数释放内存。如这样的代码:int*ptr,*ptr2;inti;ptr=(int*)malloc(sizeof(int)*20);ptr2=ptr;for(i=0;i20;i+)*ptr=i;ptr+;free(ptr2);Object Pascal 中,动态分配内存的函数是 GetMem(),与之对应的释放函数为FreeMem()(传统 Pascal 中获取内存的函数是 New()和 Dispose(),但 New()只能获得对象的单个实体的内存大小,无法取得连续的存放多个对
7、象的内存块)。因此,与上面那段 C 的代码等价的 Object Pascal 的代码为:varptr,ptr2:integer;i:integer;begin GetMem(ptr,sizeof(integer)*20);/这句等价于 C 的 ptr=(int*)malloc(sizeof(int)*20);ptr2:=ptr;/保留原始指针位置 fori:=0 to 19 do begin ptr:=i;Inc(ptr);end;FreeMem(ptr2);end;对于以上这个例子(无论是 C 版本的,还是 Object Pascal 版本的),都要注意一个问题,就是分配内存的单位是字节(B
8、YTE),因此在使用 GetMem 时,其第二个参数如果想当然的写成 20,那么就会出问题了(内存访问越界)。因为 GetMem(ptr,20);实际只分配了 20个字节的内存空间,而一个整形的大小是四个字节,那么访问第五个之后的所有元素都是非法的了(对于 malloc()的参数同样)。七、字符数组的运算。七、字符数组的运算。C 语言中,是没有字符串类型的,因此,字符串都是用字符数组来实现,于是也有一套 str打头的库函数以进行字符数组的运算,如以下代码:charstr15;char*pstr;strcpy(str,teststr);strcat(str,_testok);pstr=(char
9、*)malloc(sizeof(char)*15);strcpy(pstr,str);printf(pstr);free(pstr);而在 Object Pascal 中,有了 String类型,因此可以很方便的对字符串进行各种运算。但是,有时我们的 Pascal 代码需要与 C 的代码交互(比如:用 Object Pascal 的代码调用 C 写的 DLL或者用 Object Pascal 写的 DLL准备允许用 C 写客户端的代码)的话,就不能使用 String 类型了,而必须使用两种语言通用的字符数组。其实,Object Pascal 提供了完全相似 C 的一整套字符数组的运算函数,以上
10、那段代码的 Object Pascal版本是这样的:varstr:array 1.15 of char;pstr:PChar;/Pchar 也就是 Char begin StrCopy(str,teststr);/在 C 中,数组的名称可以直接作为数组首地址指针来用/但 Pascal 不是这样的,因此 str前要加上取地址的运算符 StrCat(str,_testok);GetMem(pstr,sizeof(char)*15);StrCopy(pstr,str);Write(pstr);FreeMem(pstr);end;八、函数指针。八、函数指针。在动态调用 DLL中的函数时,就会用到函数指
11、针。假设用 C 写的一段代码如下:typedefint(*PVFN)(int);/定义函数指针类型 int main()HMODULE hModule=LoadLibrary(test.dll);PVFN pvfn=NULL;pvfn=(PVFN)GetProcAddress(hModule,Function1);pvfn(2);FreeLibrary(hModule);就我个人感觉来说,C 语言中定义函数指针类型的 typedef代码的语法有些晦涩,而同样的代码在 Object Pascal 中却非常易懂:type PVFN=Function(para:Integer):Integer;va
12、r fn:PVFN;/也可以直接在此处定义,如:fn:function(para:Integer):Integer;hm:HMODULE;begin hm:=LoadLibrary(test.dll);fn:=GetProcAddress(hm,Function1);fn(2);FreeLibrary(hm);end;Delphi 构造函数中抛出异常会自动先调用析构函数 Delphi 里,如果构造函数中抛出了异常,则会自动先执行析构函数,然后再把异常向外抛出;而在 C 里,构造函数中若有异常抛出,则析构函数是不会被调用的。Delphi 简化了 COM 接口中的 AddRef、Release和
13、QueryInterface C 里一般用模板对 COM 接口进行封装,而在 Delphi 里,AddRef、Release以及QueryInterface都被编译器隐藏掉了,当把一个 IUnknown 类型的变量(本质上也是一个指针)赋值给另一个变量时,编译器在背后自动 AddRef,当一个 IUnknown 变量离开作用域的时候(再也没有人使用它),Release被自动调用,而 QueryInterface 被抽象为 AS 运算符:软件开发网 procedureFoo(constAParam:IUnknown);var bar:IUnknown;other:IStream;begin ba
14、r:=AParam;/AParam 指向的实例由于赋值操作被 AddRef一次 other:=barasIStream;/调用了一次 QueryInterface,引用计数再次加一 end;/返回时,other和 bar都离开作用域,分别被调用 Release各一次 C 中用模板(比如_com_ptr)也可以使引用计数自动化,不过 QueryInterface 就没那么方便了。九九.数据类型对照表数据类型对照表 序号 C/C+类型 ObjectPascal类型 序号 C/C+类型 ObjectPascal类型 1 unsigned short int Word 12 char Char 2 s
15、igned short int SmallInt 13 signed char ShortInt 3 unsigned int Cardinal 3.25 fix 14 unsigned char Byte 4 signed int Integer 15 char*PChar 5 UINT LongInt or Cardinal 16 LPSTR or PSTR PChar 6 WORD Word 17 LPWSTR or PWSTR PWideChar 3.12 fix 7 DWORD LongInt or Cardinal 18 void*Pointer 8 unsigned long L
16、ongInt or Cardinal 19 BOOL Bool 9 unsigned long int LongInt or Cardinal 20 float Single 10 signed long LongInt 21 double Double 11 signed long int LongInt 22 long double Extended 十十.关键字对照表关键字对照表 LP,NP,PP,P 前缀:if first=T then T becomes P else P 前缀 x 序号 C/C+类型 ObjectPascal 类型 序号 C/C+类型 ObjectPascal类型
17、1HANDLE THandle 39 ABC TABC 2FARPROC TFarProc 40 RASTERIZER_STATUS TRasterizer_Status 3ATOM TAtom 41 MOUSEHOOKSTRUCT TMouseHookStruct 4TPOINT TPoint 42 CBTACTIVATESTRUCT TCBTActivateStruct 5TRECT TRect 43 HARDWAREHOOKSTRUCT THardwareHookStruct 6COLORREF TColorRef 44 EVENTMSG TEventMsg 7OFSTRUCT TOFS
18、truct 45 WNDCLASS TWndClass 8DEBUGHOOKINFO TDebugHookInfo 46 MSG TMsg 9BITMAP TBitMap 47 MINMAXINFO TMinMaxInfo 10 RGBTRIPLE TRGBTriple 48 SEGINFO TSegInfo 11 RGBQUAD TRGBQuad 49 ACCEL TAccel 12 BITMAPCOREHEADER TBitmapCoreHeader 50 PAINTSTRUCT TPaintStruct 13 BITMAPINFOHEADER TBitmapInfoHeader 51 C
19、REATESTRUCT TCreateStruct 14 BITMAPINFO TBitmapInfo 52 CBT_CREATEWND TCBT_CreateWnd 15 BITMAPCOREINFO TBitmapCoreInfo 53 MEASUREITEMSTRUCT TMeasureItemStruct 16 BITMAPFILEHEADER TBitmapFileHeader 54 DRAWITEMSTRUCT TDrawItemStruct 17 HANDLETABLE THandleTable 55 DELETEITEMSTRUCT TDeleteItemStruct 18 M
20、ETARECORD TMetaRecord 56 COMPAREITEMSTRUCT TCompareItemStruct 19 METAHEADER TMetaHeader 57 WINDOWPOS TWindowPos 20 METAFILEPICT TMetaFilePict 58 WINDOWPLACEMENT TWindowPlacement 21 TEXTMETRIC TTextMetric 59 NCCALCSIZE_PARAMS TNCCalcSize_Params 22 NEWTEXTMETRIC TNewTextMetric 60 SIZE TSize 23 LOGBRUS
21、H TLogBrush 61 MENUITEMTEMPLATEHEADER TMenuItemTemplateHeader 24 LOGPEN TLogPen 62 MENUITEMTEMPLATE TMenuItemTemplate 25 PATTERN TPattern TLogBrush 63 DCB TDCB 26 PALETTEENTRY TPaletteEntry 64 COMSTAT TComStat 27 LOGPALETTE TLogPalette 65 MDICREATESTRUCT TMDICreateStruct 28 LOGFONT TLogFont 66 CLIEN
22、TCREATESTRUCT TClientCreateStruct 29 ENUMLOGFONT TEnumLogFont 67 MULTIKEYHELP TMultiKeyHelp 30 PANOSE TPanose 68 HELPWININFO THelpWinInfo 31 KERNINGPAIR TKerningPair 69 CTLSTYLE TCtlStyle 32 OUTLINETEXTMETRIC TOutlineTextMetric 70 CTLtype TCtltype 33 FIXED TFixed 71 CTLINFO TCtlInfo 34 MAT2 TMat2 72
23、 DDEADVISE TDDEAdvise 35 GLYPHMETRICS TGlyphMetrics 73 DDEDATA TDDEData 36 POINTFX TPointFX 74 DDEPOKE TDDEPoke 37 TTPOLYCURVE TTTPolyCurve 75 DDEAACK TDDEAck 38 TTPOLYGONHEADER TPolygonHeader 76 DEVMODE TDevMode 77 KANJISTRUCT TKanjiStruct 如何将如何将 C/C+程序转译成程序转译成 Delphi 1 c 头文件分解头文件分解 2 基本转换基本转换 2.1
24、名字名字 该 c-程序通常用大写字母类型标识符,例如 MY_TYPE。在 Delphi 中,类型标识符是有 T开头加上类型名称组成,不使用下划线。C 类型标识符 MY_TYPE 的 Delphi类型是 TMyType。在 C 早期的头文件的指针类型为 LPMY_TYPE。翻译成 Delphi 应该是 PMyType才符合 Borland的风格。常量的命名通常与原来的名称,包括大写字母和下划线。以下是一些实例 C Delphi-翻译 typedefstruct _IMAGE_FILE_HEADER WORD Machine;WORD NumberOfSections;DWORD TimeDate
25、Stamp;DWORD PointerToSymbolTable;DWORD NumberOfSymbols;WORD SizeOfOptionalHeader;WORD Characteristics;IMAGE_FILE_HEADER,*PIMAGE_FILE_HEADER;type PImageFileHeader=TImageFileHeader;TImageFileHeader=packed record Machine:Word;NumberOfSections:Word;TimeDateStamp:DWORD;PointerToSymbolTable:DWORD;NumberOf
26、Symbols:DWORD;SizeOfOptionalHeader:Word;Characteristics:Word;end;#define LANG_NEUTRAL 0 x00#define LANG_AFRIKAANS 0 x36#define LANG_ALBANIAN 0 x1C#define LANG_ARABIC 0 x01#define LANG_BASQUE 0 x2D#define LANG_BELARUSIAN 0 x23#define LANG_BULGARIAN 0 x02#define LANG_CATALAN 0 x03#define LANG_CHINESE
27、0 x04 CONST LANG_NEUTRAL=$00;LANG_AFRIKAANS=$36;LANG_ALBANIAN=$1C;LANG_ARABIC=$01;LANG_BASQUE=$2D;LANG_BELARUSIAN=$23;LANG_BULGARIAN=$02;LANG_CATALAN=$03;LANG_CHINESE=$04;2.2 单元附属单元附属 C 和 C+使用#include 在另一头文件和源文件包含头文件。Delphi 是引用单元(在USES 中引用)代替头文件。例如:D3D.H includes D3DTYPES.H,D3DCAPS.H D3DTYPES.H incl
28、udes DDRAW.H 一个单元包含一个头文件的翻译,所以 D3DTYPES.H 和 D3DCAPS.H 被 请求并入D3D.H 因此翻译成 delphi,则是 D3D.PAS USES 需要 D3DTYPES.PAS,D3DCAPS.PAS。在 windows.pas Borland 已经为我们做了很多工作。Borland 的 Windows 单元包含了大部分的基本的 Windows 的数据类型,所以任何翻译单元需要 Windows 数据类型需要在其 USES 中引用 Windows 单元。注意:在 Delphi 1,为 windows.pas 替代 winprocs.pas 和 wint
29、ypes.pas,因为这两个单元包括在 windows.pas 的 Delphi32 位版本定义的 Delphi 16 位。在 Delphi 2 中,为了向后兼容,这两个文件在 Delphi 的 32位版本中也被当作 windows.pas。一些头文件包含源码不被直接翻译成 Pascal 语言,但头文件在汇编上的影响必须纳入翻译代码。例如,PSHPACK.H 包含编译器指令,不能直接翻译到 Delphi;PSHPACK4.H 指示编译器使用 4字节的包。2.3#defines 和和 constants C 语言中#define被用于:声明一个常量;声明一个条件编译的符号;声明一个宏;C 语言中
30、常量的声明如下:#define NameOfConstant Value 例如:#define TIME_ZONE_ID_UNKNOWN 0#define TIME_ZONE_ID_STANDARD 1#define TIME_ZONE_ID_DAYLIGHT 2 翻译成 delphi:CONST TIME_ZONE_ID_UNKNOWN=0;TIME_ZONE_ID_STANDARD=1;TIME_ZONE_ID_DAYLIGHT=2;2.3.1 16 进制的值进制的值 C 语言#define MY_CONSTANT 0 xFF Delphi 语言:CONST MY_CONSTANT=$FF
31、;3 数据类型数据类型 3.1 基本数据类型基本数据类型 C Delphi UNSIGNED LONG Dword(Longint)UNSIGNED SHORT word INT integer UNSIGNED CHAR byte,char(Depending on usage)3.2 winapi 公共类型公共类型 Windows API定义了一些常见 API类型。这是建议的名称,翻译尽可能使用。windows.pas 声明了许多这些类型,其中一些如下:API Type 声明 在 DELPHI中用法 Type 说明 ULONG ULong DWord PULONG PULong DWord
32、 USHORT UShort SmallInt PUSHORT PUShort SmallInt UCHAR UChar Byte PUCHAR PUChar Byte DWORD DWord DWord PDWORD,LPDWORD PDWord DWord BOOL Bool Bool PBOOL,LPBOOL PBool Bool BYTE Byte Byte PBYTE,LPBYTE PByte Byte WORD Word Word PWORD,LPWORD Pword Word INT Integer Integer PINT,LPINT PInteger Integer LPVO
33、ID Pointer Untyped Pointer UINT UInt Integer PUINT,LPUINT PUInt Integer WCHAR WChar WideChar PWCHAR,LPWCHAR,PCWCH,LPCWCH,NWPSTR,PWChar WideChar PWSTR,LPWSTR LPWStr WideChar PCWSTR,LPCWSTR LPCWStr WideChar PCH,LPCH PChar Char PSTR,LPSTR LPStr Char PCSTR,LPCSTR LPCStr Char HANDLE THandle DWord PHANDLE,LPHANDLE PHandle DWord 3.3 数组数组 方法 1 C 语言中的数组:DWORD MyType4 翻译成 DELPHI如下:MyType=Array 0.3 of DWord;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1