“地址”VB6到VB.NET

问题描述 投票:6回答:4

我有一些问题要将我的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
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,您仍然需要它。

那时他编译应该很开心。但是,其他人提出的观点很重要。 VB6中的整数和长整数的长度与VB.NET中的长度不同。因此在.NET中,只要在VB6中使用Long,就需要使用Integer。


3
投票

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

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


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

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)
© www.soinside.com 2019 - 2024. All rights reserved.