C++如何调用delphi制作的dll
一、概述及示例代码
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
相关文档:
由于C++编译器需要支持函数的重载,会改变函数的名称,与标准C中函数名称不同。然而dll的导出函数通常是标准C定义的,让标准C编写的dll函数定义在C和C++编译器下都能编译通过,通常会使用以下的格式:(这个格式在很多成熟的代码中很常见)
#ifdef __cplusplus extern "C"
{
#endif
// ......
getchar函数是定义在 stdio.h 文件中的一个输入函数。它从标准输入设备(一般是键盘)中读取一个字符。
在实际工作中,它是这样完成的:
键盘输入到计算机中的字符并不是立刻送到内存中指定位置,而是会首先缓存到一个缓冲区中。这个是计算机为了弥补不同硬件之间速度差距,而惯用的伎俩。
当在程序中第一次调用 getchar ......
C语言中许多符号是被“重载”的,有些关键字也被重载而具有好几种意义,值得注意的几个符号如下:
符号 意义
static 在函数内部,表示该变量的值在各个调用间一直保持延续性
在函数这一级,表示该函数只对本文件可见
extern 用于 ......
什么是回调函数?
简而言之,回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。
为什么要使用回调函数?
因为可以把调用者与被调用者分开。调用者不关心谁是被调用者,所有它需知道的,只是存在 ......