在Delphi与C++之间实现函数与工具共享
副标题#e#
在Delphi中挪用C++函数与C++挪用Delphi函数相当直接,需要留意的是,Delphi 1默认的函数挪用方法是Pascal方法,Delphi 4、Delphi 5的默认方法则是优化的cdecl挪用方法,即register方法。要在C++ 与Delphi措施之间实现函数共享,除非有充实的原因,不然应该利用尺度系统挪用方法,即stdcall方法。为了使C++编译器不将函数标志为"mangled",使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();在elphi中:function TestFunc:integer; stdcall;external”TestFunc.DLL”;工具的共享在C++与Delphi之间的工具共享主要表此刻工具要领(Method)的共享方面,这种共享可分为两个条理:工具(Object) 级共享与类(Class)级共享。要实现工具级共享,措施设计语言需具备两个前提条件:可以或许界说指向由另一语言建设的工具的指针;可以会见由指针确定的工具中的要领。
要实现类级的共享,则还需思量:可以或许建设由另一种语言界说的类的实例;可以从堆中释放一个实例所占用的空间;派生新的类。
以下先容在Delphi与Borland C++之间实现工具共享的要领。
1.C++共享Delphi工具要实现从C++挪用Delphi工具,首先要在Delphi单位的接口部门以及C++的头文件中说明需要共享的工具的接口,在工具接口中界说该工具包括哪些属性与要领,并说明可供共享的部门。
工具的共享,要害在于要领的共享。在Delphi语言中,要使一个工具可以被共享,可以把它说明为两个接口部门,暂称为"共享接口"与"实现接口"。个中共享接口指明工具中哪些要领可被另一种语言所共享;实现接口则担任共享接口,而且在单位实现部门针对实现接口中的要领界说详细的实现。要界说一个可供C++共享的Delphi工具,共享接口的说明应留意:在Delphi措施里,要共享的要领必需被说明为抽象(abstract),并且虚拟(virtual );在C++措施里,必需用要害字"virtual"及"=0"后缀,把从Delphi共享的要领说明成"pure virtual";共享的工具要领必需在两种语言里都被说明成沟通的挪用方法,凡是利用尺度系统挪用方法(stdcall)。
下面,举例说明这些法则,假设有这样的一个Delphi工具:TTestObject=classprocedure
Proc1(x:integer);function Func1(x:integer):PChar;procedure
Proc2;function Func2:integer;end;假如C++措施需要共享个中的要领Proc1、Func1,可把上述说明修改成以下形式:
STestObject=classprocedure
Proc1(x:integer); virtual; abstract;
stdcall;function Func1(x:integer);
virtual; abstract; stdcall;end;TTestObject=class(STestObject)procedure
Proc1(x:integer);fuction Func1(x:integer):PChar;
procedure Proc2;fuction
Func2:integer;end;在C++措施中做如下工具原型说明:class STestObject
{virtual void Proc1(int x)=0;virtual char *Func1(int x)=0;};
#p#副标题#e#
为了能在C++中乐成地会见Delphi界说的类, Delphi接口说明时必需包括一个可共享的"制造函数(Factory Function)"CreateTestObject,
该制造函数可被界说在动态链接库或方针文件(.OBJ)中,譬喻:LibraryTestLib;exports CreateTestObject;function CreateTestObject:STestObject;
stdcall;beginResult:=TTestObject.Create;end;…
end.颠末这样的处理惩罚,此刻可在C++措施中利用这个由Delphi界说的工具,挪用方法如下:extern "C" STestObject stdcall
*CreateTestObject();void
UseTestObject(void) {STestObject *theTestObject=CreateTestObject();theTestObject->Proc1(10);Char
#p#分页标题#e#
*str=theTestObject->Func1(0);}当挪用制造函数CreateTestObject时,实际上已经在Delphi一侧占用了一个工具实例的空间,C++措施在针对该工具的所有处理惩罚完成后必需思量释放这一空间,详细的实现可在Delphi中界说一个类,如上述Proc1的共享要领Free,以此来完成这一任务:STestObject=classprocedure Proc1(x:integer); virtual;
abstract; stdcall;function Func1(x:integer); virtual; abstract;
stdcall;procedure Free; virtual; abstract; stdcall;end;…
implementation…
procedure TTestObject.Free;begin…
end;…
end.2.Delphi共享C++工具凡是,措施员会思量利用Delphi来体例用户界面,所以Delphi代码挪用C++代码好像显得越发实际些。其实,Delphi
共享C++工具的实现要领与上述C++共享Delphi工具很是相似。用同样的共享接口与实现接口说明要领来界说C++的类:class STestObjedt
{virtual void Proc1(int x)=0;virtual char *Func1(int x)=0;};classTTestObjedt :public STestObject {void Proc1(int x);char *Func1(int
x);void Proc2();int Func2();void Free();};然后实现这些要领。同样地,C++工具需要一个与之对应的制造函数,这里以DLL为例STestObject
stdcall export *CreateTestObject() {return (STestObject *) new TTestObject.Create;}Delphi代码可以通过挪用制造函数reateTestObject,很容易地在C++中建设实例,得到指向该实例的指针值,并以这个指针值来挪用工具中的共享要领。虽然,在举办完该工具的相关处理惩罚后,千万不要忘了挪用Free释放占用的空间。