一、概述及示例代码
Delphi中包括许多已经封装好的类及控件,其中的非可视化控件库以功能方式划分可处理诸多应用需求。若使用C++实现系统时对某些功能简单调用delphi中现成的库时即可。因此将delphi中的库以DLL形式封装好之后如何将方法导出可供C++调用是本文记录的重点。C++调用的方式有多种,在这里只讨论一种静态编译方式,一是为了代码的规范可读性,二是防止接口变化带来的维护问题。
Delphi对外接口单元:
library ftpUpload;
uses
SysUtils,
Classes, dialogs,
FileUpLuo in 'FileUpLuo.pas';
var
mTask : TFtpUpFileLuo;
taskParam : SUpTask;
{$R *.res}
function SendFile_luo(szSrcFile: pchar; szDesFile: pchar;
szFtpServer: pchar; strUsername: pchar;
strPassword: pchar): Integer; export; stdcall;
begin
mTask := TFtpUpFileLuo.Create(true);
with taskParam do
begin
szSrc := szSrcFile;
szDes := szDesFile;
szServer := szFtpServer;
szUsername := strUsername;
szPassword := strPassword;
end;
result := mTask.TransFile(taskParam);
mTask.Resume;
end;
function GetUpPercent(nCmd: Integer) : Integer; export; stdcall;
begin
mTask.SetCommand(nCmd);
result := mTask.GetUpStatus;
end;
exports
SendFile_luo index 1,
GetUpPercent index 2;
begin
end.
二、编译及生成LIB文件
1)调试、编译生成ftpUpload.dll文件;
2)Impdef.exe ftpUpload.def ftpUpload.dll 生成DEF文件;
3)修改DEF文件
LIBRARY FTPUPLOAD.DLL
EXPORTS
GetUpPercent@4 @2
SendFile_luo@20 @1
以上所示是DEF文件内容,其中红体字部分(@4,@20)是修改添加的内容,它的规则是方法参数列表中的参数个数乘以4即可
4)lib.exe /def:ftpUpload.def 生成LIB文件
5)编写C++ header文件
#ifndef LIB_FTP_UPLOAD_LUO_091016
#define LIB_FTP_UPLOAD_LUO_091016
extern "C" __declspec(dllexport)
int __stdcall SendFile_luo(char *szsrc, char *szdes, char *szserver,
char *szusername, char *szpassword);
extern "C" __declspec(dllexport)
int __stdcall GetUpPercent(int nCmd);
#endif
6)在VC工程中加入头文件与LIB文件编译成功即可。