在我工作的公司中,我们使用C#开发所有GUI,但应用程序内核主要是在Delphi 5中开发的(由于历史原因),在COM +中有很多组件。与这个非常具体的应用相关,我有两个问题:
在Delphi和/或COM中经验丰富的人,您是否有任何工作场所可以使用错误的TLB界面? 一些错误是:IDE在大型TLB的编辑过程中崩溃,方法ID丢失,TLB损坏等。 在这里,我们还没有找到任何好的解决方案。实际上我们尝试升级做新的2007版本。但是新的IDE TLB接口具有我们之前发现的相同错误。
您如何控制TLB版本? TLB文件采用二进制格式,冲突解决方案很难做到。我们尝试将接口描述导出到IDL并提交到CVS,但我们没有找到任何使用Delphi从IDL生成TLB的好方法。另外,Microsoft提供的MIDL工具没有正确解析我们从delphi导出的IDL文件。
答案 0 :(得分:10)
答案 1 :(得分:8)
在遥远的过去(在我开始为CodeGear工作之前),我放弃了IDE提供的奇怪的Delphi化IDL语言,并编写了我自己的IDL并使用MS midl编译它。这很有用;唯一的问题是IIRC,它确保dispids(id属性)在属性getter& amp;的自动化接口(dispinterfaces)上是正确的。 setter - tlibimp有一些不变的预期,但midl并不保证。
但是,现在Delphi 2009使用了一个安全的midl语法子集,并且包含了一个用于这个midl的编译器并集成到IDE中,这些问题应该成为过去。
答案 2 :(得分:5)
我们刚刚安装了Delphi 2009,它似乎确实改进了对Typelibraries的支持。然而,我已经与COM和类型库合作了很长一段时间,这是我多年来发现的一般陷阱。我同意它很漂亮,并且一直到Delphi 2006(我们使用2009之前的版本)。
但是我认为你最好的解决方案可能是升级。您也获得了Unicode支持。
答案 3 :(得分:3)
使用Delphi 2009大大减轻了巨大的TLB文件带来的痛苦,现有对象的转换很轻松,但我们的com对象不使用任何第三方库。
一旦库供应商发布支持的版本,我们将迁移我们的gui应用程序。
答案 4 :(得分:2)
这里有与TLB界面相同的经验:我们只是停止使用它。
我们为框架的不同部分使用几个单独的IDL文件(手工构建),利用#include构造将它们包含到实际应用程序的IDL中,然后使用MIDL和tlibimp生成单个tlb 。如果应用程序没有自己的IDL,则可以使用预编译版本的不同框架TLB文件。
每当框架进入新版本时,都会运行一个脚本,在IDL文件中的所有必要接口上重新生成GUIDS。
这已经很好地服务了我们多年,而且对于我们来说,移动新的Delphi 2009 IDL / TLB工具集不仅要集成到IDE中,还要在自动构建等方面具有多种功能。迫不及待地想通过一些实验弄脏我的手!