在Delphi中调用C++函数与C++调用Delphi函数相当直接,需要注意的是,
Delphi 1默认的函数调用方式是Pascal方式,Delphi 2、Delphi 3的
默认方式则是优化的cdecl调用方式,即register方式。要在C++与Delphi
程序之间实现函数共享,除非有充分的原因,否则应该使用标准系统调用方式,
即stdcall方式。为了使C++编译器不将函数标记为"mang led",使Delphi
编译器误认为函数是采用cdecl调用方式,应该在C++代码中,以extern "C "
说明被共享的函数,如下例所示:
原型说明:
在C++中:
extern "C" int _stdcall TestFunc();
在Delphi中:
function TestFunc:integer;
stdcall;
调用语法:
在C++中:
int i=TestFunc();
在Delphi中:
var i:integer;
…
begin
…
i:=TestFunc;
…
end;
共享函数的参数必须是两种语言都支持的变量类型,这是正确传递参数的前提。
诸如Delphi的currency、string、set等变量类型,在C++中没有相对应的
变量类型,不能被用作共享函数的参数。可以用PChar类型以值参的方式传递
字符串指针,这时用户必须注意字符串空间的回收。Delphi语言中的变参应被
说明成C++中相应变量类型的引用形式,如下:
在Delphi中:
function TestFunc(var i:integer):integer;
在C++中:
int TestFunc(int &i);
在Delphi与C++之间实现代码链接可采用静态链接或动态链接的方式。
1.静态链接方式
如果C++程序本身的代码量很小,而且无需担心与C运行库会有交互过程,
一般可选用静态链接方式,即把Delphi与C++的目标文件(*.OBJ)链接成
最终的可执行文件。具体的方法是使用{$L}编译指令,使Delphi编译器
自动读取指定目标文件,说明如下:
function TestFunc:integer;stdcall;
{$L TestFunc.OBJ}
2.动态链接方式
如果C++代码已经相当全面或自成一个完整的子系统,代码量很大,或者用到
了C运行库,在这种情况下,应该使用动态链接库(DLL)的方式。此时,在两种
语言的源代码中应做如下说明:
在C++中:
int stdcall export TestFunc();
在Delphi中:
function TestFunc:integer;
stdcall;
external ‘TestFunc.DLL’;