簡體   English   中英

“地址” VB6 到 VB.NET

[英]“ addressof ” VB6 to 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)

您可能會看到此錯誤:

'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 Sub,您仍然需要它。

那時他的編譯器應該很高興。 但是,其他人提出的觀點很重要。 整數和長整數的長度在 VB6 中與在 VB.NET 中不同。 因此,在 .NET 中,您需要在 VB6 中使用 Long 的任何時候使用 Integer。

關於非托管代碼中的回調,看看這篇類似的帖子是否對你有幫助。

關於您的問題-我認為您不需要回調函數或您發布的示例不正確/不完整-請參閱上面指出的帖子並闡明您的代碼示例。

我假設 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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM