扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:陈经韬 来源:csdn 2007年10月31日
关键字:
这种方法的好处在于最终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文件了.
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者