首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络编程-> Visual Basic教程
在delphi与c++之间实现函数与对象共享_delphi教程
作者:网友供稿 点击:0
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
  Delphi以其独特的面向控件的开发方式、强大的数据库功能以及快速的编译技术,使
得它自发布起即格外引人注意。随着Delphi 3提供丰富的Internet应用,Delphi日益成为
最重要的软件开发工具之一, 它吸引了许多原Visual Basic、Foxpro、dBase甚至C++的
程序员,而这些程序员使用Delphi时需要解决的一个重要问题就是怎样利用他们原有的代
码。本文将介绍Delphi与C++程序集成的方法,包括:
    S Delphi与C++之间函数的共享;
    S 代码的静态链接和动态链接;
    S 对象的共享。
    函数的共享
    在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’;
    对象的共享
    在C++与Delphi之间的对象共享主要体现在对象方法(Method)的共享方面,这种共享
可分为两个层次:对象(Object)级共享与类(Class)级共享。
    要实现对象级共享,程序设计语言需具备两个前提条件:
    S 能够定义指向由另一语言创建的对象的指针;
    S 可以访问由指针确定的对象中的方法。
    要实现类级的共享,则还需考虑:
    S 能够创建由另一种语言定义的类的实例;
    S 可以从堆中释放一个实例所占用的空间;
    S 派生新的类。
    以下介绍在Delphi与Borland C++之间实现对象共享的方法。
    1.C++共享Delphi对象
    要实现从C++调用Delphi对象,首先要在Delphi单元的接口部分以及C++的头文件中说
明需要共享的对象的接口,在对象接口中定义该对象包含哪些属性与方法,并说明可供共
享的部分。对象的共享,关键在于方法的共享。在Delphi语言中,要使一个对象可以被共
享,可以把它说明为两个接口部分,暂称为"共享接口"与"实现接口"。其中共享接口指明
对象中哪些方法可被另一种语言所共享;实现接口则继承共享接口,并且在单元实现部分
针对实现接口中的方法定义具体的实现。要定义一个可供C++共享的Delphi对象,共享接
口的说明应注意:
    S 在Delphi程序里,要共享的方法必须被说明为抽象(abstract),而且虚拟(virtual
);
    S 在C++程序里,必须用关键字"virtual"及"=0"后缀,把从Delphi共享的方法说明成
"pure virtual";
    S 共享的对象方法必须在两种语言里都被说明成相同的调用方式,通常使用标准系统
调用方式(stdcall)。
    下面,举例说明这些规则,假设有这样的一个Delphi对象:
    TTestObject=class
    procedure Proc1(x:integer);
    function Func1(x:integer):PChar;
    procedure Proc2;
    function Func2:integer;
    end;
    如果C++程序需要共享其中的方法Proc1、Func1,可把上述说明修改成以下形式:
    STestObject=class
    procedure 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;
    };
    为了能在C++中成功地访问Delphi定义的类, Delphi接口说明时必须包含一个可共享
的"制造函数(Factory Function)"CreateTestObject,该制造函数可被定义在动态链接库
或目标文件(.OBJ)中,例如:
    Library TestLib;
    exports CreateTestObject;
    function CreateTestObject:STestObject; stdcall;
    begin
     Result:=TTestObject.Create;
    end;
    …
    end.
    经过这样的处理,现在可在C++程序中使用这个由Delphi定义的对象,调用方式如下:
    extern "C" STestObject stdcall *CreateTestObject();
    void UseTestObject(void) {
    STestObject *theTestObject=CreateTestObject();
    theTestObject->Proc1(10);
    Char *str=theTestObject->Func1(0);
    }
    当调用制造函数CreateTestObject时,实际上已经在Delphi一侧占用了一个对象实例
的空间,C++程序在针对该对象的所有处理完成后必须考虑释放这一空间,具体的实现可在
Delphi中定义一个类,如上述Proc1的共享方法Free,以此来完成这一任务:
    STestObject=class
    procedure 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;
    };
    class TTestObjedt :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代码可以通过调用制造函数CreateTestObject,很容易地在C++中创建实例,获
得指向该实例的指针值,并以这个指针值来调用对象中的共享方法。当然,在进行完该对
象的相关处理后,千万不要忘了调用Free释放占用的空间。

文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·ASP.net中动态加载控件时一些问题的总结-ASP教程,ASP应用
·C#读写注册表-.NET教程,C#语言
·Visual Basic .NET中的异常处理简介(下)-.NET教程,VB.Net语言
·C#:文件的按行读/写及文件目录对话框的使用-.NET教程,C#语言
·ADO.Net:使用DataReader向数据库中插入数据-ASP教程,数据库相关
·列一张网恋赔偿清单(爆笑)
·如何用Photoshop画服装款式图-网页设计,Photoshop
·.NET下使用DataAdapter保存数据时,如何生成command语句及使用事务-.NET教程,数据库应用
·新型dc/dc电源控制芯片dpa426的应用
·ASP.NET 2.0 - Enter Key - Default Submit Button-.NET教程,Asp.Net开发
最新文章
·个人站长的网络赚钱两条新出路_网赚技巧
·adsense帐户最佳化纵深谈-adsense资深专员_网赚技巧
·google adsense容易被k的可能性列表_网赚技巧
·如何让程序被站长接受和产生利润_站长访谈
·马云,即成的中国互联网第4代霸主_站长访谈
·google关键词广告创建的十二招_google推广
·如何使google更快速收录你的新站_google推广
·几个颇有创意的网站推广方法_站长心得
·网络编辑:标题,如何让网民一见钟情(2)_网络编辑
·网站建设基础seo搜索引擎优化_seo网站优化
相关主题
  • 在delphi中使用xml文档有两种方法_delphi教程
  • 在delphi中,如何把mdi工作区的粗边框去掉_delphi教程
  • 在delphi中通过函数获取guid_delphi教程
  • 在delphi中利用createremotethread远程注入例子_delphi教程
  • 在delphi中使用createoleobject方法对word文件进行操作_delphi教程
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭