您想将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. oracle将一个字段拆分成多个值 (regexp_substr函数)

    select regexp_substr(p.attributename, '[^,]+',1,level) c1from tablename p connect by level <= len ...

  2. 利用filter过滤去重

    var r, ary = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry']; r ...

  3. win10永久激活

    现在我们可以看下当前系统的激活状态,查看方法"WIN+R"打开运行对话框,输入命令slmgr.vbs -xpr,点击确定,这样可以查看到当前系统的激活信息.大家可以发现,虽然小编系 ...

  4. 分分钟钟学会Python - 文件操作

    文件操作 1 文件基本操作 obj = open('路径',mode='模式',encoding='编码') obj.write() # 写入 obj.read() # 读取 obj.close() ...

  5. 模拟Django的admin自定义stark组件

    1.新建Django项目--新建app:app01和stark--在settings中配置app和数据库--在models.py中新建模型表--完成数据库迁移 2.在stark下的apps.py中: ...

  6. MySQL最优配置文件模板·2016-11-28

    小伙伴们大爱的MySQL最优配置文件模板更新啦.对之前的MySQL最优配置文件·20160901做了一些修正,更为名至实归.可以通过此链接进行下载.当然,更欢迎同学们提出意见和建议,共同打造一个最优M ...

  7. [BZOJ3932] [CQOI2015]任务查询系统(主席树 || 树状数组 套 主席树 + 差分 + 离散化)

    传送门 看到这个题有个很暴力的想法, 可以每一个时间点都建一颗主席树,主席树上叶子节点 i 表示优先级为 i 的任务有多少个. 当 x 到 y 有个优先级为 k 的任务时,循环 x 到 y 的每个点, ...

  8. 【Intellij 】Intellij IDEA 添加jar包的三种方式

    一.直接复制:(不推荐) 方法:直接将硬盘上的jar包复制粘贴到项目的lib目录下即可. 注意: 1.对于导入的eclipse项目,该方式添加的jar包没有任何反应,用make编译项目会报错 2.对于 ...

  9. 【Tomcat】Tomcat Connector的三种运行模式【bio、nio、apr】

    Tomcat Connector(Tomcat连接器)有bio.nio.apr三种运行模式 bio bio(blocking I/O,阻塞式I/O操作),表示Tomcat使用的是传统的Java I/O ...

  10. hdu - 1151 Air Raid(有向无环图的最小路径覆盖)

    http://acm.hdu.edu.cn/showproblem.php?pid=1151 在一个城市里有n个地点和k条道路,道路都是单向的,并且不存在环.(DAG) 现在伞兵需要去n个地点视察,伞 ...