快速业务通道

在Delphi与C++之间实现函数与对象共享

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

在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

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号