博客文章"用C++Builder和Delphi开发应用程序“说
您用Delphi编写的几乎任何东西都可以很容易地在C++Builder (.)中使用。您可以为Delphi编写一次对象,然后在C++项目中重复使用它。
那么TInterfacedObject及其基于参考计数的自动内存管理呢?这是否也适用于C++Builder,而不产生内存泄漏呢?还是基于C++的内存管理与这种基于ref计数的接口技术不兼容?
德尔菲/ C++ TInterfacedObject文档说(由我强调):
TInterfacedObject提供了基本的引用计数功能,使其后代类在Delphi和C++代码中都很有用。
请注意:这个问题是关于在C++Builder项目中直接编译Delphi / Object源代码(在运行C++Builder预编译器之后),而不是通过动态链接(DLL)。
发布于 2015-03-02 22:05:38
C++编译器并不像__interface那样直接实现引用计数。但是,System 中有一个方便的模板,用于包装接口并提供引用计数, 系统::DelphiInterface,这是标准的C++生成器方法,用于编写类似于Delphi的代码。
使用它的类型是在使用接口编译.hpp文件时在.pas文件中自动生成的,并且可以很容易地在C++代码中创建。事实上,您可能以前见过它们--使用此模板自动生成的类型名称都是以_di_开头的,例如Delphi接口IMyInterface的转换是_di_IMyInterface。
直接从帮助文件链接复制是以下示例:
// Interface that exposes an Add(..) method
__interface INTERFACE_UUID("{D0C74612-9E4D-459A-9304-FACE27E3577D}") IAdder : public System::IInterface
{
virtual int __fastcall Add(int I, int J) = 0 ;
};
typedef System::DelphiInterface<IAdder> _di_IAdder;在您的_di_Adder代码中任何地方使用C++,而不是IAdder,您将发现引用被计算在内。
有用的阅读是关于DAX的整个章节,它是C++ Builder中新的( XE)标准COM系统,它取代了C++。可以在CB的早期版本中使用它(例如,我在2010年就这样做了),但它没有得到支持。我喜欢我鼓励它成为官方支持,通过一些交谈,我当时与一些内部Embarcadero的工作人员。(我不知道我是否真的有任何影响力,我只是想这样想:)
发布于 2015-03-02 15:23:46
C++编译器不会发出调用AddRef和Release的代码。在interface中没有特殊的C++类型。相反,您需要确保对AddRef和Release进行了必要的调用。这通常是通过在智能指针中封装原始接口来实现的。在C++-Builder中,您可以选择使用DelphiInterface或TComInterface<T>。
Serg在本文中谈到了这个主题:在Dephi和C++中使用Delphi接口。该条的摘要值得重复:
值得提及的一些细节:
https://stackoverflow.com/questions/28813133
复制相似问题