您想将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. Java代码的编译和执行

    Java代码编译和执行的整个过程包含了以下三个重要的机制: (1)Java源码编译机制 (2)类加载机制 (3)类执行机制 1.Java代码编译是由Java源码编译器来完成,流程图: Java 源码编 ...

  2. find_in_set()和in()比较

    转载于:https://www.cnblogs.com/zqifa/p/mysql-4.html 作者:zqifa 因为自己太懒了,就从大佬那转载来,作为一次笔记! mysql 中find_in_se ...

  3. 无插件纯Web 3D机房,HTML5+WebGL倾力打造

    前言 最近项目开发任务告一段落,刚好有时间整理这大半年的一些成果.使用html5时间还不久,对js的认识还不够深入.没办法,以前一直搞java,对js的一些语言特性和概念一时还转换不过来. 上一篇大数 ...

  4. linux通用makefile文件

    OUTPUT_DLL := libmy.so LIBS :=-L../public/lib/x64/linux -lzookeeper_mt -lcurl \ -lfreetype -lopencv_ ...

  5. Java中Arrays作用

    Arrays类是提供对数组进行排序.查询和修改等操作方法的工具类.(Arrays:尽可进行数组升序排序) 格式:Arrays.sort(数组名); Package Java; import java. ...

  6. mysql通配符进行模糊查询

    在mysql数据库中,当我们需要模糊查询的时候 ,我们会使用到通配符. 首先我们来了解一下2个概念,一个是操作符,一个是通配符. 操作符 like就是SQL语句中的操作符,它的作用是指示在SQL语句后 ...

  7. Centos6.8 安装mongo3.6以及权限配置和开启外网链接

    目录 安装环境和版本说明,以及参考文档链接 安装MongoDB数据库 运行MongoDB数据库 删除卸载MongoDB 配置MongoDB管理员用户 修改配置文件,允许外网链接 安装配置完成,使用Ro ...

  8. 杭电 2035 (快速幂) 求A^B的最后三位数表示的整数

    Description 求A^B的最后三位数表示的整数. 说明:A^B的含义是“A的B次方”    Input 输入数据包含多个测试实例,每个实例占一行,由两个正整数A和B组成(1<=A,B&l ...

  9. 远程调试nodejs

    一   windows作为远程服务器 1.在远程服务器(192.168.1.1)上安装node-inspector:npm install -g node-inspector // -g 导入安装路径 ...

  10. 【01】什么是AJAX

    什么是AJAX   AJAX(异步 JavaScript 和 XML)是 synchronous(英[ˈsɪŋkrənəs]) JavaScript and XML 的简称. AJAX不是一门新的编程 ...