1. 程式人生 > >混合使用Delphi和C ++(附下載)

混合使用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相容,無執行時混合使用兩種語言是一項非常強大的功能。該視訊值得關注:它深入探討了這些技術,包括它們的原因,並展示了專案中的程式碼。

您可以在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讀起來非常有趣!