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

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

6 голосов
/ 17 марта 2010

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

5 голосов
/ 17 марта 2010

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

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

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

3 голосов
/ 17 марта 2010

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

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

2 голосов
/ 17 марта 2010

Я предполагаю, что вторым параметром 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 голосов
/ 17 марта 2010

Очень приятно, спасибо!

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

код 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)
...