У меня есть некоторая проблема для преобразования моего проекта 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:
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)
Я предполагаю, что второй параметр 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
Вы, вероятно, видите эту ошибку:
Выражение 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.