使用Delphi将对象模型通过自动化接口提供:最简单的方法是什么?

3
我们正在从头开始使用Delphi重写计算核心,并且我们正在寻找让其他人针对它编写代码的方法。
自动化似乎是完成这项工作的一种相当安全的方式。其中一个用途是使其可用于VBA/Office,并生成基于自动化对象的.NET程序集(这很容易)。
但是,由于我们将使用Delphi编写我们的(桌面)UI,因此代码仍应易于从Delphi中使用。
现在我一直在研究如何在Delphi中创建自动化服务器,看起来设计类型库向导中的组件并生成基本代码是相当麻烦的。
我们必须实现的计算是根据尚未批准的正式规则和法规描述的,因此在完成之前可能会发生变化 - 很可能会发生相当大的变化。等待最终版本不是一个选项。
另一种替代方法可能是先完成整个对象模型,然后编写一个单独的自动化服务器,仅描述顶级对象,切换$METHODINFO ON,并使用TObjectDispatch返回所有下属对象。如我所见,这将需要编写包装器以通过IDispatch接口返回对象。因为那里有100多个不同的类,所以这看起来不是一个吸引人的选择。 编辑:TObjectDispatch足够聪明,可以包装由属性和方法返回的任何对象;因此,只需要包装顶级对象即可。然而,缺乏完整的类型库意味着只能进行后期绑定。
在Delphi中编写COM可访问的对象模型的其他更简单(无麻烦)的方法吗?
2个回答

2

您无需使用类型库设计器。您可以编写或生成(例如从Delphi类的RTTI中)一个.ridl文件,并将其添加到自动化库项目中。


那么...编写 Delphi 代码,使用 RTTI 生成 .ridl 文件,然后使用正确的接口、GUID 等更新 Delphi 代码? 有没有可以做到这一点的工具? - Martijn
.ridl文件应该已经包含了GUID和接口声明。你可以让Delphi生成一个包含实现存根的Delphi单元(就像类型库设计器一样),然后通过委托属性/方法调用到你的原始类来填充实现。我不知道是否有这样的工具可用,但我还没有去搜索过。 - Ondrej Kelle

0
从RTTI生成接口描述是一个很好的想法!在生成了接口之后,您可以从中生成一个Delphi单元,并将其实现在您的类中。当然,大部分都已经实现了,因为毕竟您是从这些类生成了接口。然后,可以通过手动使用RTTI并在可脚本化类的公共基类中实现IDispatch和IDispatchEx来进行后期绑定解析。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接