您想将C ++添加到Delphi应用程序中吗?或者将Delphi代码添加到C ++应用程序中?这是如何做。

您可能不知道的一件事是如何在RAD Studio中集成C ++和Delphi语言。您可以将单个项目中的单个应用程序编译为单个EXE,混合使用两种语言。(当然,你也可以使用DLL或包来实现。)如果使用C ++ Builder,这对添加Delphi实现的库很有用。如果您使用Delphi,您可能希望使用部分C ++来利用C ++库,或者LLVM优化器。

对于CodeRage XI(2016),我做了关于混合Delphi和C ++代码的演示。谈话是在线的,但是这篇博文还讨论了如何混合两者并提供源代码


 

有两个方面:将Delphi添加到C ++ Builder项目中,并将C ++添加到Delphi项目中。

将Delphi添加到C ++ Builder

您可以将任何.pas文件添加到C ++项目中。(C ++ Builder支持将Pascal文件添加到C ++项目中多年,至少从CB2006开始。)当你添加一个Pascal文件并构建C ++项目时,.pas文件是在任何C ++文件和Delphi之前构建的。编译器自动生成扩展名为.hpp的C ++头。这与VCL或FMX的标题完全相同!这允许C ++代码引用Delphi类和类型,完全不知道它们没有用C ++实现,并且在链接时Delphi代码链接到C ++代码。

Delphi和C ++兼容ABI。实际上,您甚至可以创建从Delphi类继承的C ++类。我们的C ++编译器支持Delphi语言扩展,如ARC,闭包等。结合标头生成,这意味着两种语言可以无缝互操作,C ++很容易调用Delphi代码。实际上,每次使用VCL编写UI时都会这样做。

将C ++添加到Delphi

相反,从Delphi调用C ++代码也是可能的,虽然稍微复杂一些。没有相当于Delphi代码的标头生成来向Delphi声明C ++代码。例如,Delphi没有标题的概念。最接近的是单元的接口部分 - 单元看起来是什么样的C ++代码的翻译?

相反,视频显示了一种技术,我个人推荐,从Delphi代码调用C ++。在Delphi中定义一个抽象基类,然后在一个包中继承它并在C ++中实现它。这给你一个在Delphi中定义的接口,你可以在Delphi中使用它,就好像它是一个Delphi对象,但它实际上是用C ++实现的。

C ++ Builder支持包,这导致优雅的代码分离。在视频中,C ++类在包中实现,并结合Delphi可以调用以创建实例的工厂方法。在C ++类中,您可以使用任何您想要的C ++ - 客户的一个常见问题是,“如果您使用Delphi中的类,您是否可以使用C ++功能?” 答案是否定的,你不受限制。Delphi只看到Delphi中定义的接口,以及它可以理解的类型。在实现中,包括在派生类的头文件中,您可以使用任何您想要的C ++。

这是一种非常强大的技术,可以将C ++添加到Delphi应用程序中。出于多种原因,您可能希望这样做,例如使用C ++库,或者在Windows上使用LLM优化,例如,数学代码。

请注意,同时使用Delphi和C ++项目需要同时使用Delphi和C ++ Builder - 即RAD Studio,其成本低于两者。很划算,让您访问强大的代码!

在本机编译的二进制级别,ABI兼容,无运行时混合使用两种语言是一项非常强大的功能。该视频值得关注:它深入探讨了这些技术,包括它们的原因,并展示了项目中的代码。

您可以在Github上找到示例项目。有三个项目:

  • 从C ++项目开始,调用Delphi代码:

    • CPP_Call_Delphi:添加了.pas文件的C ++项目
  • 从Delphi项目开始,调用C ++代码:
    • Delphi_Call_CPP:一个Delphi项目,它定义一个抽象基类,并调用一个包
    • CPPPackage:一个实现抽象类的C ++包,将它的一个实例返回给Delphi代码,并用C ++做各种事情来演示C ++的使用,无论它是否被Delphi调用

https://community.embarcadero.com/blogs/entry/mixing-delphi-and-c#comment-19887

https://github.com/EmbarcaderoPublic/CodeRage2016/tree/master/David%20Millington%20-%20Mixing%20Delphi%20and%20C%2B%2B

----------------------------------------------------------------------------------------------------------------

这种从Delphi使用C ++的方法有哪些限制?我可以让我的Delphi端抽象类继承自我想要的任何类吗?或者这仅适用于纯粹的*抽象的普通的Delphi类?
此外,这里的机制究竟是什么?事实上VMT是一样的吗?

您的Delphi端类只是从C ++继承而来。它不一定是抽象的,不是 - 它可以有正常的方法。一个例子可能是用C ++编写一个组件,继承自TCustomControl。这很好用。
机制:是的,Delphi派生的C ++类具有兼容的对象布局。实际上存在一些通常不可见的复杂性,主要是由于语言行为的不同而在构造期间是对象身份。请查看:
http//docwiki.embarcadero.com/RADStudio/Berlin/en/Object_Construction_for_C%2B%2BBuilder_Libraries
以及
http://docwiki.embarcadero.com/RADStudio/Berlin/en/C%2B% 2B_and_Object_Pascal_Models了解更多一般信息。它不一定是轻读,但IMO读起来非常有趣!

混合使用Delphi和C ++(附下载)的更多相关文章

  1. BAT等大厂已开源的70个实用工具盘点(附下载地址)

    前面的一篇文章<微软.谷歌.亚马逊.Facebook等硅谷大厂91个开源软件盘点(附下载地址)>列举了国外8个互联网公司(包括微软.Google.亚马逊.IBM.Facebook.Twit ...

  2. 音乐播放插件Aplayer+WebAPI的使用【附下载】

    本次介绍的是音乐播放器APlayer结合WebAPI的使用,先给各位看下效果:   上面就是APlayer的效果,然后这插件的地址是 https://github.com/DIYgod/APlayer ...

  3. 传说中的MATLAB1.0(1984年DOS界面182K、运行良好)附下载

    传说中的MATLAB1.0(1984年DOS界面182K.运行良好)附下载 你见过 MATLAB 最早的版本吗?下载一份 MATLAB 1.0,(只有182K, 只有20来个函数) 体会一下吧.MAT ...

  4. English -有感过四六级后的托福单词表-附下载

    好像自从上学期不高不低过了六级之后就没怎么持续接触英语的东西了,欧,除了要debug的时候遇到问题了,去Google到了再用那些仅有的英语知识去看别人的文章.可能是因为看到的都是自己平时接触过的方面的 ...

  5. ASP CDONTS.NEWMAIL组件发送电邮(附下载)

    附CDONT.NEWMAIL组件下载地址:http://files.cnblogs.com/files/colinliu/cdonts.rar ASP常规发送方法: <% dim mail se ...

  6. Houdini FX 14 重磅推出!(附下载方式)

    把之前发布在新浪的博客搬过来了,新浪广告太多,影响阅读和观感,博客园很清净~ SideFX于2015年1月在官网发布Houdini FX 14,喜爱尝鲜.充满好奇心的我迫不及待的装上Apprentic ...

  7. delphi ehLib 安装包下载及安装方法

    1.下载安装包,这里提供一个百度云盘共享链接,D7-XE8都有:https://pan.baidu.com/s/1DTlxok4RiSmDokuabnGvQw2.添加环境变量,菜单"Tool ...

  8. VCL界面控件DevExpress VCL Controls发布v18.2.5|附下载

    DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...

  9. VCL界面控件DevExpress VCL Controls发布v18.2.4|附下载

    DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...

随机推荐

  1. 六、面向切面的spring(2)

    这个是承接五的,这部分主要的内容是在XML中声明切面. 一.在XML中声明切面 让我们先看一下spring中的AOP配置元素有哪些: AOP配置元素 用途 <aop:advisor> 定义 ...

  2. BZOJ 3326 [SCOI2013]数数 (数位DP)

    洛谷传送门 题目: Fish 是一条生活在海里的鱼,有一天他很无聊,就开始数数玩.他数数玩的具体规则是: 确定数数的进制$B$ 确定一个数数的区间$[L, R]$ 对于$[L, R] $间的每一个数, ...

  3. java IO流 内容整理

    在java中,对数据的输入和输出操作以流的方式进行.(注:对文件的操作用io.File类,但不能对文件中的内容进行操作) 一.IO流的分类: 按数据流的方向不同,可以分为输入流和输出流: 按处理数据的 ...

  4. Buffer.compare()

    Buffer.compare(buf1, buf2) buf1 {Buffer} buf2 {Buffer} 返回:{Number} 比较 buf1 和 buf2 通常用于 Buffer 数组的排序目 ...

  5. vue项目编译配置 用于结合Django项目

  6. 84-Market Facilitation Index 市场促进指数指标.(2015.7.3)

    Market Facilitation Index 市场促进指数指标 MFI指标的计算方式为: MFI=High(最高价)-Low(最低价))/ Volume(成交量) MFI上升,成交量上升,表示价 ...

  7. 杭电 5363 求集合的非空子集中key的数量

    Description soda has a set S with n integers {1,2,…,n}. A set is called key set if the sum of intege ...

  8. 09-看图理解数据结构与算法系列(B树)

    B树 B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树.B_树.是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找.插入和删除.B树一般较多用在存储系统上,比如数 ...

  9. JS判断滚动条是否停止滚动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  10. 【BZOJ4872】分手是祝愿(期望DP)

    题意: B 君在玩一个游戏,这个游戏由 n 个灯和 n 个开关组成,给定这 n 个灯的初始状态,下标为 从 1 到 n 的正整数.每个灯有两个状态亮和灭,我们用 1 来表示这个灯是亮的,用 0 表示这 ...