Visual Basic程序的一部分将移至.NET dll。
参数调用可以成功传递,并且一切运行正常。
在长时间运行的异步任务后,如何通过VB6的.NET回调函数进行调用?
在.NET中
Public Delegate Function VBCallBackFunc() As Integer
Public Function DoSomething(a As String, b As String, c As String, _
parent As IntPtr, Optional ByVal CallbackAddr As VBCallBackFunc = Nothing) As Boolean Implements _DotNetLib.DoSomething
VB6
result = DotNetLib.DoSomething(strA, strB, strC, Me.hwnd, AddressOf DotNetCallback)
Public Function DotNetCallback() As Long
MsgBox ("Callback")
End Function
在VB的对象浏览器中:
Function DoSomething(strA As String, strB As String, strC As String,
parent As Long, [CallbackAddr As VBCallBackFunc]) As Boolean
Member of DotNetLib
但它说“无效使用AddressOf运算符”
与使用事件相关的注释是一个不错的选择,但是我倾向于更多地使用接口,因此这里提供了一种解决方案。
(徒手的代码,您需要进行语法检查,并且可以清除名称,它们仅用于说明目的)
在.NET中:
为您的回调创建一个COM公开接口:
Public Interface IVBCallBack
Public Function VBCallBackFunc() As Integer
End Interface
更改您的DoSomething就像这样:
Public Function DoSomething(a As String, b As String, c As String, parent As IntPtr, ByVal CallbackAddr As IVBCallBack) As Boolean
在VB6中:
result = DotNetLib.DoSomething(strA, strB, strC, Me.hwnd, Me)
(您将需要使用您的类,控件或表单来Implements IVBCallBack
)
Public Function IVBCallBack_VBCallBackFunc() As Long
MsgBox ("Callback")
End Function
由于.NET持有对VB6对象的引用,因此请确保在.NET端具有清除和释放所有引用的方法。
另一件事要注意。除主UI线程外,请勿在其他任何线程上返回VB6!
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句