混合使用Delphi和C ++(附下载)

摘要:
是否要将C++添加到Delphi应用程序中?或者在C++应用程序中添加Delphi代码?将Delphi添加到C++Builder中您可以添加任何。pas文件转换为C++项目。(C++Builder多年来支持将Pascal文件添加到C++项目中。)当您添加Pascal文件并构建C++项目时,这允许C++代码引用Delphi类和类型。每次使用VCL编写UI时都会执行此操作。

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

混合使用Delphi和C ++(附下载)第1张您可能不知道的一件事是如何在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 ++(附下载)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇移远通信LC29DBurpSuite实战——合天网安实验室学习笔记下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[转]面向物联网的21个开源软件项目

  原文链接:https://my.oschina.net/RainyZou/blog/1605337 物联网市场呈现碎片化、无定形、不断变化的特点,其性质需要不仅仅像平常那样关注互操作性。开源在这方面表现不俗也就不足为奇了——客户犹豫不决,不敢将物联网的未来寄托在一种可能销声匿迹或变得难以定制、互联的专有平台上。 我在本文中介绍了主要的开源软件项目,专注...

SQL实现类似于自动刷新数据的功能

有时需要在SQL中,定时刷新某张表,比如说是要定时查询某张表的行数,通常做法就是手动的按F5去执行来刷新数据。但是如果这个定时查询历时较长,10分钟,或半小时,手动的话肯定是要崩溃了。貌似SQL没有像应用程序自动刷新的功能,可能是我还不知道有这样的功能,于是就写了一个类似自动刷新数据的脚本,需要手动中止程序的运行,当然也可以写个条件,自动结束语句的执行。...

TransactionScope使用说明 【转】

TransactionScope是.Net Framework 2.0滞后,新增了一个名称空间。它的用途是为数据库访问提供了一个“轻量级”[区别于:SqlTransaction]的事物。使用之前必须添加对 System.Transactions.dll 的引用。        下列代码就是一个正在创建的事务,这个事务自身还封装了多个数据库查询。只要任意一个...

持久化存储解决方案MagicalRecord使用

一个针对 Core Data 的三方库 -- MagicalRecord。MagicalRecord 提供了便利的方法来创建那些使用Core Data 所必须的代码,诸如对 Core Data 的设置、查询、更新。它的设计灵感来源于德高望重的 Active Record 设计模式。 创建一个应用来追踪你最喜爱的beer(或者其他类似的饮料),它将具备以下功...

react中使用antd-mobile的dreawer抽屉组件从踩坑到自己造轮子

  1. 如果在使用过程中报这个错,意思是Drawer组件必须有一个子组件children,但现在还未定义       用官方例子解释就是<Drawer>这里面必须要有内容,如下图红色框部分内容</Drawer>    而这里面的内容一般为自定义代码      2. 如果你想让弹出的侧边导航栏在页面右侧       不要在state...

一个简单的项目介绍流程

以一个简单的项目进行介绍说明: • 最近测试的Tpshop项目是一个B/S架构的Web项目。Tpshop是一个 B2C的电商平台系统,运营模式类似于天猫,京东这些B2C类型网站。 • 项目系统由前台和后台两部分构成。前台面向购物用户,包括会员、商品展示、购物车、订单、支付、用户中心等系统模块。后台面向经营商家,包括商品管理,会员管理,订单处理等系统模块。...