混合使用Delphi和C ++(附下载)
您想将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兼容,无运行时混合使用两种语言是一项非常强大的功能。该视频值得关注:它深入探讨了这些技术,包括它们的原因,并展示了项目中的代码。
- 从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 ++(附下载)的更多相关文章
- BAT等大厂已开源的70个实用工具盘点(附下载地址)
前面的一篇文章<微软.谷歌.亚马逊.Facebook等硅谷大厂91个开源软件盘点(附下载地址)>列举了国外8个互联网公司(包括微软.Google.亚马逊.IBM.Facebook.Twit ...
- 音乐播放插件Aplayer+WebAPI的使用【附下载】
本次介绍的是音乐播放器APlayer结合WebAPI的使用,先给各位看下效果: 上面就是APlayer的效果,然后这插件的地址是 https://github.com/DIYgod/APlayer ...
- 传说中的MATLAB1.0(1984年DOS界面182K、运行良好)附下载
传说中的MATLAB1.0(1984年DOS界面182K.运行良好)附下载 你见过 MATLAB 最早的版本吗?下载一份 MATLAB 1.0,(只有182K, 只有20来个函数) 体会一下吧.MAT ...
- English -有感过四六级后的托福单词表-附下载
好像自从上学期不高不低过了六级之后就没怎么持续接触英语的东西了,欧,除了要debug的时候遇到问题了,去Google到了再用那些仅有的英语知识去看别人的文章.可能是因为看到的都是自己平时接触过的方面的 ...
- ASP CDONTS.NEWMAIL组件发送电邮(附下载)
附CDONT.NEWMAIL组件下载地址:http://files.cnblogs.com/files/colinliu/cdonts.rar ASP常规发送方法: <% dim mail se ...
- Houdini FX 14 重磅推出!(附下载方式)
把之前发布在新浪的博客搬过来了,新浪广告太多,影响阅读和观感,博客园很清净~ SideFX于2015年1月在官网发布Houdini FX 14,喜爱尝鲜.充满好奇心的我迫不及待的装上Apprentic ...
- delphi ehLib 安装包下载及安装方法
1.下载安装包,这里提供一个百度云盘共享链接,D7-XE8都有:https://pan.baidu.com/s/1DTlxok4RiSmDokuabnGvQw2.添加环境变量,菜单"Tool ...
- VCL界面控件DevExpress VCL Controls发布v18.2.5|附下载
DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...
- VCL界面控件DevExpress VCL Controls发布v18.2.4|附下载
DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包.所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速 ...
随机推荐
- [Android] java代码无错误,但跳转失败
今天在调代码的时候,出现了这样的问题,我晕了半天,才找到解决办法. 查看日志发现:Initialize Binary Program Cache: Load Failed 从来没见过这种问题,Java ...
- Zoj 3781(构造)
Zoj 3781(构造) Zoj 3781 As we all know, Coach Gao is a talented chef, because he is able to cook M dis ...
- Numpy第一课
import numpy as np a = np.array([1,2,3]) print(a) # [1 2 3] a2 = np.array([[1, 2], [3, 4]]) print('a ...
- Master of Subgraph
Problem E. Master of SubgraphYou are given a tree with n nodes. The weight of the i-th node is wi. G ...
- caca需要用到x11作为图形输出
编译错误:no output drivers were selected!. yum -y install xcb-proto yum -y install libxcb-devel.x86_64 l ...
- 听dalao讲课 7.26
XFZ今天讲了些关于多项式求ln和多项式求导以及多项式求积分的东西 作为一个连导数和积分根本就不会的蒟蒻,就像在听天书,所以不得不补点前置知识 1.积分 积分是微积分学与数学分析里的一个核心概念.通常 ...
- 1085 数字游戏 2003年NOIP全国联赛普及组
丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分 ...
- 逆袭指数-——杭电校赛(dfs)
逆袭指数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu4696 Answers(循环节+找规律)
题意: 分析: 容易想到先把T数组按位置和对应权值建一个有向图(类似置换群那种指法) 然后图建完了,如果C[]里面都是2,那显然只能凑出那些偶数,奇数是不能凑出来的 如果C[]有1有2呢? 事实上是可 ...
- Ubuntu 16.04使用百度云的方案
Ubuntu没有很好的解决方案,都是一些投机取巧的方案: 1.不建议安装百度云客户端,尤其对于免费用户来说,会限制速度. 2.可以使用网页版进行文件上传. 3.下载可以通过Chrome点击下载后,复制 ...