【问题标题】:" addressof " VB6 to VB.NET"addressof" VB6 到 VB.NET
【发布时间】:2010-03-17 15:11:32
【问题描述】:

我在将我的 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)

【问题讨论】:

  • 请使用格式

标签: vb.net callback vb6 address-operator


【解决方案1】:

您可能会看到此错误:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 是的,它不是完整的代码,只是所有与addressof函数一起做的事情,我需要回调函数
    【解决方案3】:

    我假设 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
    

    【讨论】:

      【解决方案4】:

      这是 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)
      

      【讨论】:

        猜你喜欢
        • 2011-12-05
        • 1970-01-01
        • 2017-12-20
        • 2017-12-19
        • 1970-01-01
        • 2018-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多