6

我在将我的 VB6 项目转换为 VB.NET 时遇到了一些问题

我不明白这个“AddressOf”函数应该如何在 VB.NET 中使用

我的 VB6 代码:

Declare Function MP4_ClientStart Lib "hikclient.dll" _
  (pClientinfo As CLIENT_VIDEOINFO, ByVal abab As Long) As Long

Public Sub ReadDataCallBack(ByVal nPort As Long, pPacketBuffer As Byte, _
  ByVal nPacketSize As Long)

  If Not bSaved_DVS Then
    bSaved_DVS = True
    HW_OpenStream hChannelHandle, pPacketBuffer, nPacketSize
  End If
    HW_InputData hChannelHandle, pPacketBuffer, nPacketSize

End Sub

nn1 = MP4_ClientStart(clientinfo, AddressOf ReadDataCallBack)
4

4 回答 4

5

您可能会看到此错误:

“AddressOf”表达式无法转换为“Long”,因为“Long”不是委托类型。

您可能想要做的是创建一个委托,然后将 adab 的类型更改为该委托类型。将此添加到类中:

Public Delegate Sub ReadDataCallBackDelegate(ByVal nPort As Long, _
  ByVal pPacketBuffer As Byte, ByVal nPacketSize As Long)

然后将您的 P/Invoke 声明更改为:

Declare Function MP4_ClientStart Lib "hikclient.dll" (ByVal pClientinfo As _
  CLIENT_VIDEOINFO, ByVal abab As ReadDataCallBackDelegate) As Long

不要删除/更改您的 ReadDataCallBack Sub,您仍然需要它。

那时他的编译器应该很高兴。但是,其他人提出的观点很重要。Integers 和 Longs 的长度在 VB6 中与在 VB.NET 中不同。因此,在 .NET 中,您需要在 VB6 中使用 Long 时使用 Integer。

于 2010-03-17T15:58:55.250 回答
3

关于非托管代码中的回调,看看这篇类似的帖子是否对您有帮助。

关于您的问题-我认为您不需要回调函数,或者您发布的示例不正确/不完整-请参阅上面的帖子并澄清您的代码示例。

于 2010-03-17T15:16:28.527 回答
2

我假设 MP4_ClientStart 的第二个参数应该是回调函数的地址。问题可能是您在此处将其定义为 Long,它在 VB6 中是 32 位值,但在 VB.NET 中是 64 位值。通过将声明更改为:

Declare Function MP4_ClientStart Lib "hikclient.dll" _
    (pClientinfo As CLIENT_VIDEOINFO, ByVal abab As Integer) As Integer
于 2010-03-17T15:51:35.123 回答
0

这是 VB.NET 的实现:

Declare Function MP4_ClientStart Lib "hikclient.dll" (ByRef pClientinfo As _
  CLIENT_VIDEOINFO, ByVal abab As ReadDataCallBackDelegate) As Integer

Public Delegate Sub ReadDataCallBackDelegate(ByVal nPort As Long, _
  ByRef pPacketBuffer As Byte, ByVal nPacketSize As Long)

Public Sub ReadDataCallBack(ByVal nPort As Integer, ByRef pPacketBuffer As _
  Byte, ByVal nPacketSize As Integer)

  If Not bSaved_DVS Then
    bSaved_DVS = True
    HW_OpenStream(hChannelHandle, pPacketBuffer, nPacketSize)
  End If
  HW_InputData(hChannelHandle, pPacketBuffer, nPacketSize)

End Sub

MP4_ClientStart(clientinfo, AddressOf ReadDataCallBack)
于 2010-03-17T18:51:08.417 回答