如何在Delphi程序中直接使用C语言程序代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何在Delphi程序中直接使用C语言程序代码
秦艳友;张云浩;姜迎新
【摘要】阐述了在Delphi程序中如何直接使用C语言程序代码,从而发挥它们各自的编程优点和特长.
【期刊名称】《通化师范学院学报》
【年(卷),期】2004(025)004
【总页数】3页(P26-28)
【关键词】Delphi;C语言;链接
【作者】秦艳友;张云浩;姜迎新
【作者单位】通化师范学院网络信息中心,吉林,通化,134002;通化师范学院网络信息中心,吉林,通化,134002;通化市第一中学
【正文语种】中文
【中图分类】TP313
随着计算机技术的高速发展,我们所使用的操作系统也发生了很大的变化,由单一文字界面的DOS操作系统转入了多任务图形界面的Windows操作系统,随之而来的,在DOS下的那些编程工具也都大多被Windows下的可视化编程工具所替代.由于Windows下的可视化编程工具有强大的功能和极高的效率,把软件的快速开发带到了一个新领域,从而被越来越多的编程人员所喜爱.现在Windows下的可视化编程工具有很多,例如Microsoft公司的VC++、VB、VF等;Borland 公司的Delphi、C++Builder、JBuilder等.每一种编程工具都拥有大批的使用者
群,既然一种编程工具能够出现与存在,且又有它自己的使用者群,那么它就应该有它存在的价值.我们不必去分辩哪一种编程工具会更好一些,重要的是要找到一种适合于自己的.但是由于每种编程工具所使用的编程语言和编译器的不同,使得各种编程语言不能很好的结合在一起使用,从而难以发挥它们各自的优点和特长.下面以Delphi和C语言为例来说明如何将这两种语言结合到一起编写程序. Delphi适合用于开发应用程序,但是它对底层硬件的开发并不是强项,而C语言在这方面就占有一定的优势,而且很多硬件的SDK包也是用C来写的.那么如何把这两种语言很好的结合在一起使用呢?常用的方法有3种:
这种方法的优点是简单易用,不需要附属文件的支持,但用这种方法写出来的程序在发布时要额外带上这个DLL动态链接库文件.例如,让编程人员用C语言写一个DLL动态链接库,提供对底层硬件操作的函数,这样对于Delphi的编程人员只需在Delphi中调用C语言编写的DLL动态链接库文件,然后引用DLL动态链接库中的函数就可以轻松的实现对底层硬件的操作.
C语言的函数格式与Delphi不同,它是函数返回类型在前,函数声明在后.对于没有任何返回类型的函数,则定义为void类型.如:Delphi中函数function
M_Function:(x:integer):Bool,对应的C语言代码就应该写成Bool
M_Function(int x);还有在Delphi程序中可以定义过程,而在C语言中却没有过程这个概念,那么我们就可以这样的改写,如:在Delphi中的procedure
M_Procedure,对应的C语言代码就应该写成void M_Procedure(void);Delphi与C的类型之间的对应关系在此就不一一列出.
这种方法生成程序不需要附属文件的支持,可是采用这种方法,一般要求编程人员本人对Delphi和C这两种编程语言都比较熟悉,才能准确地将C语言代码改写成Delphi程序代码,而且当C语言的代码比较多时,编程人员的工作量也会相当繁重.
这种方法的优点是简单易用,生成程序不需要附属文件的支持,也不需要熟悉C 语言.
各种程序设计语言代码在编译成可执行程序、DLL或OCX等文件之前,都必须得先生成*.OBJ目标文件,然后把*.OBJ目标文件和*.RES资源文件链接成最终的可执行程序、DLL或OCX等文件.而由于编译器的不同,生成的*.OBJ目标文件又分为COFF、OMF等不同的格式,其中Microsoft公司的编译器生成的*.OBJ目标文件为COFF格式;Borland公司的编译器生成的*.OBJ目标文件为OMF格式,这些对于学过Win32ASM的编程人员来说应该是很清楚的.因为我们要在Borland公司的Delphi中链接C语言的OBJ文件,所以必须使用Borland公司的C++Builder,或者使用Borland公司官方网站提供的免费编译工具.下面我们通过一个简单的例子来说明具体操作步骤:
(1) 用C语言编写一个函数,用来判断一个文件是否为Dat格式的VCD文件.
头文件声明如下:
/*
文件名称:DatFormat.h
*/
#ifndef DatFormat_H
#define DatFormat_H
#include <windows.h>
#pragma pack(push, 1)//这个与下面的配对,一般用到记录类型的时候需要定义#ifdef __cplusplus
extern "C" {
#endif
extern BOOL CheckIsDatFile(const char * FileName,BOOL *IsDatFile);
#ifdef __cplusplus
}
#endif
#pragma pack(pop)
#endif // DatFormat_H
具体实现代码DatFormat.c如下:
#include "DatFormat.h"
BOOL CheckIsDatFile(const char * FileName,BOOL *IsDatFile)
/*
函数说明:该函数用于判断一个文件是否为Dat文件(即VCD文件)格式. 参数:
IN:
FileName:欲判断的文件名称
IN,OUT:
IsDatFile:是否为Dat格式文件
OUT:
读文件失败返回FALSE,否则返回TRUE.
*/
{
HANDLE hFile;
DWORD dwBytesRead;
BOOL re;
char MyBuf[4];
*IsDatFile=FALSE;
//建立读文件句柄
hFile =
CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTI NG,0,0);
if (hFile == INVALID_HANDLE_VALUE) return FALSE;
//读文件
re = ReadFile(hFile,&MyBuf,4,&dwBytesRead,NULL);
if (dwBytesRead!=4)
{
CloseHandle(hFile);
return FALSE;
}
//读文件失败的时候
if (re!=TRUE)
{
CloseHandle(hFile);
return FALSE;
}
CloseHandle(hFile);
*IsDatFile=(MyBu[0]=='R' && MyBuf[1]=='I' && MyBuf[2]=='F' && MyBuf[3]=='F');
return(TRUE);
}
运行C++Builder,新建一个工程,然后把DatFormat.c添加到工程里面,编译
整个工程,将得到我们需要的DatFormat.OBJ文件.然后我们关闭C++Builder即可.
(2) 在Delphi程序中,直接使用上面用C语言生成的DatFormat.OBJ文件.
运行Delphi,新建一个工程并保存,然后把DatFormat.OBJ拷贝到它的目录之下,在单元的implementation下面添加如下代码:
{$LINK 'DatFormat.obj'} //链接外部OBJ文件
function _CheckIsDatFile(const
FileName:Pchar;IsDatFile:PBool):Bool;cdecl;external;//定义函数.其中cdecl进栈方式说明采用的是C语言格式传递参数.external说明的是个外部声明函数.
注意函数声明的原形与C定义的不一样.必须在前面添加一个下划线.原因是因为编译器的链接符号中C与C++是不一样的.因为这个不是本文重点,所以这里不作讨论. 然后写如下代码调用此函数:
procedure TFrmMain.Button1Click(Sender: TObject);
var
IsDatFile:Bool;
begin
if OpenDialog1.Execute then
if _CheckIsDatFile(Pchar(OpenDialog1.FileName),@IsDatFile) then
if IsDatFile then
ShowMessage('恭喜!该文件是一个Dat格式的视频文件!')
else
ShowMessage('很抱歉,该文件不是一个Dat格式的视频文件!')
else ShowMessage('读文件错误!');
end;
编译这个程序,将得到一个可执行EXE文件,并且这个可执行文件不需要外部附属文件的支持就能够直接运行.
【相关文献】
[1]Michael Barr.C/C++嵌入式系统编程[M].中国电力出版社,2001.
[2]Paul Kimmel .Delphi 6 应用开发指南 [M]. 清华大学出版社, 2002.。

相关文档
最新文档