使用Delphi中COM类的方法

时间:2016-09-09 08:59:25

标签: vb.net delphi com

我在VB.NET中创建了一个COM类。我试图在Delphi 5.0中使用它。

我看过一些关于这个主题的例子/问题,即:

Call C# dll from Delphi

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

结果类:

<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';

无法编译。我收到一个错误:

  

功能需要结果类型

有什么明显的我做错了吗?

2 个答案:

答案 0 :(得分:1)

要创建ComObject,您有两个选项:

  • CoCreateInstance的
    https://msdn.microsoft.com/de-de/library/windows/desktop/ms686615(v=vs.85).aspx
    这需要按照您之前描述的方式注册ComObject。你可以这样称呼它:

    CoCreateInstance(YourClassID, nil, CLSCTX_INPROC_SERVER, YourInterfaceID, Result)

  • 您的DLL导出一个创建请求实例的函数。然后,您可以在加载DLL时导入此函数。无需注册。

    function MyFunc: IMyInterface; external 'MyDll.dll';

不要忘记使用两种语言都支持的合适的调用方法(如stdcall或cdecl)

答案 1 :(得分:0)

感谢亚历山大B向我发送正确的方向 - 还有一些细节我必须添加,否则我会选择他的输入作为正确答案。

因此,正如我在评论中所述,我在delphi GUI中导入了tld文件,并使用CoClassName.Create来访问对象。虽然这在运行时给了我错误,因为应用程序无法找到VB.NET dll,但我收到了错误消息&#39;系统找不到指定的文件&#39;即使我用regasm导入了dll。然后我找到了以下帖子

Call C# dll from Delphi

其中声明必须将标志/代码库添加到regasm命令。一旦我使用带有此标志的regasm导入dll,一切都运行良好。希望这有助于其他人。