"addressof" 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)
6
задан Deduplicator 20 December 2017 в 19:32
поделиться

4 ответа

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

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

3
ответ дан 10 December 2019 в 00:36
поделиться

Очень хорошо, спасибо!

Я сделал это примерно так

Код 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)
0
ответ дан 10 December 2019 в 00:36
поделиться

Я предполагаю, что второй параметр to 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
2
ответ дан 10 December 2019 в 00:36
поделиться

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

Выражение 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, она вам все еще нужна.

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

5
ответ дан 10 December 2019 в 00:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: