创建在Delphi程序中使用的现有COM对象的新C#版本

时间:2009-07-10 13:36:11

标签: c# delphi com activex

我们遇到了一个问题,我们丢失了一些非常古老的ActiveX组件的源代码。我们有一个调用Active X组件的Delphi7程序。这有点像矿工,不能改变太多。但是,Active X组件中的某些功能需要更新。由于我们已经将我们的应用程序移动到C#,因此决定将ActiveX重做为C#类库。

我有一个基本的C#类库来证明这个概念。我可以破解GUID和注册表,所以它看起来只是旧的。如果我查看旧类型和新类型的lib类型,它们基本上相同。几个微小的差异,但不是我想到的任何东西都是一个问题。

现在我可以看到有三种方法可以使用新的类库:

  1. 通过查找ProgId进行后期绑定。这没问题。

  2. 导入类型库。 (项目|导入类型库)这样可以。

  3. 导入为ActiveX组件。这会生成一个tlb文件。这不起作用。当我去创建组件时,我得到“没有这样的界面存在”。该课程正在加载到一个点但不完全。

  4. 现在不幸的是,Delphi程序正在使用选项3.所以我必须尝试让我的类库在这种情况下工作。我是如何理解这个错误的?我用Google搜索并找到了一些参考资料,但没有说明问题是什么。

    第二个问题。我应该知道如何做到这一点,因为我已经做过一次,但我似乎已经侥幸了。当我在Delphi中时,我执行导入ActiveX组件以生成TLB文件。现在生成的第一个C#类库显示在ActiveX控件列表中,我可以为它创建单元。但是我已经创建了另一个更简单的类库用于测试目的,并且如果我可以让这些库显示在ActiveX控件列表中,那么我就无法导入它。

    Active X组件的创建单元生成不同格式的TLB.pas到导入类型库格式及其我需要的ActiveX格式。

2 个答案:

答案 0 :(得分:2)

ActiveX控件不仅可以实现您的接口。它更像是TComponent或TWinControl。它要求您实现更多的ActiveX控件接口。通过COM / ActiveX公开的C#对象不是Control,而是一个简单的类。

它不会显示在导入ActiveX控件中,因为它不是ActiveX控件。我认为让你的C#类成为一个主动控制是不可行的。

答案 1 :(得分:1)

另一种可能性,虽然可能不是最优雅的,但是在Delphi中创建一个新的ActiveX com对象,它反过来通过你已经使用的任何一种方法调用你的C#类。

由于您声明这是针对现有的Delphi 7应用程序,您可能只想在C#端使用Com Interop,将对象公开为com可见,并直接从Delphi 7应用程序中使用它。

第一个选项可能允许您对现有应用程序进行最少的更改,但确实添加了一个很可能不需要的附加层。