我在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
结果类:
<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';
无法编译。我收到一个错误:
功能需要结果类型
有什么明显的我做错了吗?
答案 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。然后我找到了以下帖子
其中声明必须将标志/代码库添加到regasm命令。一旦我使用带有此标志的regasm导入dll,一切都运行良好。希望这有助于其他人。