混合使用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 ++。
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讀起來非常有趣!