您现在的位置: 天下网吧 >> 网吧天地 >> 天下码农 >> 后端开发 >> PHP >> 正文

在Delphi编程中使用C语言代码

2007-1-31csdn陈经韬

 

三:在Delphi中直接链接C语言的OBJ文件.

  这种方法的好处在于最终EXE不用带任何外部文件.也不用对C语言过于熟悉.

  我们都知道,代码在编译成可执行文件(或DLL,OCX文件,下同)之前,都必须得先生成OBJ文件(DELPHI一般是DCU文件,但也可以通过编辑编译选项生成OBJ文件),然后把OBJ文件和资源文件(*.RES)链接成最终的可执行文件.利用这个方法,我们可以直接把OBJ文件链接到我们的程序里面.

  不过需要注意的是,编译器不同,生成的OBJ文件也不一样.Microsoft的编译器生成的OBJ文件是COFF格式,而Borland的C++Builder生成的是OMF格式.因为我们需要在Delphi中链接,所以必须使用CBC,或者Borland官方站点带的免费编译工具.下面我们通过一个简单的例子来说明具体操作步骤:

  这个例子是简单的提供一个函数,用来判断一个文件是否为Dat格式的VCD文件.头文件声明如下:

以下是引用片段:
  /*
  文件名称:DatFormat.h
  */
  #ifndef DatFormat_H
  #define DatFormat_H
  #include 
  #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.
  ------------------------------------
  作者:陈经韬.2004,01,17. http://www.138soft.com,lovejingtao@21cn.com
  */
  {
  HANDLE hFile;
  DWORD dwBytesRead;
  BOOL re;
  char MyBuf[4];
  *IsDatFile=FALSE;
  //建立读文件句柄
  hFile = CreateFile(FileName,
  GENERIC_READ,
  FILE_SHARE_READ,
  NULL,
  OPEN_EXISTING,
  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=(MyBuf[0]=='R' && MyBuf[1]=='I' && MyBuf[2]=='F' && MyBuf[3]=='F');
  return(TRUE);
  }

  运行CBC,新建一个工程,然后把DatFormat.c添加到工程里面,编译整个工程,将得到我们需要的OBJ文件:DatFormat.OBJ.然后我们关闭CBC即可,因为下面不再需要用到它了.

  运行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文件了.

欢迎访问最专业的网吧论坛,无盘论坛,网吧经营,网咖管理,网吧专业论坛 https://bbs.txwb.com

关注天下网吧微信/下载天下网吧APP/天下网吧小程序,一起来超精彩

本文来源:csdn 作者:陈经韬

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系邮箱:support@txwb.com,系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧 网吧天下