"адрес" 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)