【发布时间】:2017-01-17 09:00:06
【问题描述】:
我在 VB.NET 中创建了一个 COM 类。我正在尝试在 Delphi 5.0 中使用它。
我看过一些关于该主题的示例/问题,即:
http://www.drbob42.com/delphi/headconv.htm
http://edn.embarcadero.com/article/32754
还有其他,但这些都是处理基本功能而不是自定义对象。
首先,我使用regasm注册了我的VB.NET COM DLL。
我的 VB.NET COM 对象定义如下:
<ComClass(Bridge.ClassId, Bridge.InterfaceId, Bridge.EventsId)> _
Public Class Bridge
' A creatable COM class must have a Public Sub New()
' with no parameters, otherwise, the class will not be
' registered in the COM registry and cannot be created
' via CreateObject.
Public Sub New()
MyBase.New()
End Sub
Public Function Quote(ByRef input As InObject) As ReturnObject
BLABLA
End Function
End Class
使用输入类:
<ComClass(InObject.ClassId, InObject.InterfaceId, InObject.EventsId)> _
Public Class InObject
End Class
还有一个 Result 类:
<ComClass(ReturnObject.ClassId, ReturnObject.InterfaceId, ReturnObject.EventsId)> _
Public Class ReturnObject
End Class
请不要注意类名和其中缺少代码。我只是想强调一下我是如何将它们定义为 COM 类的。
我找不到任何 Delphi 代码调用 COM 类中的方法或使用自定义对象作为输入和返回的示例。但是,从我上面展示的示例中,我认为 Delphi 中声明要使用的函数的行是这样的:
function Bridge.Quote(i: InObject): ReturnObject; external 'Bridge.dll';
编译失败。我收到一个错误:
函数需要结果类型
有什么明显的我做错了吗?
【问题讨论】:
-
我在帖子中间说过,我更改了名称以简化事情,我想用 .NET 代码展示的只是 COM 类是如何注册的,因此可以忽略名称。谢谢。
-
我无法将实际代码放在这里。更新班级名称以防人们错过我对他们的评论
-
在 Delphi 函数声明中尝试使用
Variant而不是ReturnObject。 -
那也没用,同样的错误信息。
-
您不能使用
external语句来导入COM 对象。您需要在 Pascal 代码中定义对象的 COM 接口,然后在运行时使用CoCreateInstance()或等效函数实例化 COM 对象,然后使用接口访问它。您可以让 Delphi IDE 导入 .NET 程序集,这样它就可以提取相关的 COM 声明并为您生成合适的 Pascal 代码。