"адрес" VB6 для VB.NET

У меня возникли проблемы с преобразованием моего проекта 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 ответа

Вы, вероятно, видите эту ошибку:

Выражение "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

Не удаляйте / не изменяйте Sub ReadDataCallBack Sub, он вам все еще нужен.

На этом этапе он должен быть счастлив. Тем не менее, точка зрения других важна. Длина целых и длинных в VB6 отличается от длины в VB.NET. Так что в.NET вам нужно использовать Integer каждый раз, когда вы использовали Long в VB6.

Что касается обратных вызовов в неуправляемом коде, посмотрите, поможет ли вам этот пост.

Что касается вашего вопроса - я не думаю, что вам нужны функции обратного вызова или пример, который вы опубликовали, не верен / не завершен - см. Пост, указанный выше, и уточните пример кода.

Я предполагаю, что второй параметр 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

Очень мило спасибо!

Я сделал это так

Код 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)
Другие вопросы по тегам