6

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

4 に答える 4

5

おそらく次のエラーが表示されます。

「Long」はデリゲート型ではないため、「AddressOf」式を「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 を削除/変更しないでください。それでも必要です。

その時点で、彼のコンパイラは満足しているはずです。ただし、他の人の指摘は重要です。Integer と Long の長さは、VB6 と VB.NET では異なります。したがって、.NET では、VB6 で Long を使用したときはいつでも Integer を使用する必要があります。

于 2010-03-17T15:58:55.250 に答える
3

アンマネージド コードのコールバックについては、この同様の投稿が役立つかどうかを確認してください。

あなたの質問について - コールバック関数が必要ないか、投稿した例が正しくない/完全ではないと思います - 上記の投稿を参照して、コードサンプルを明確にしてください。

于 2010-03-17T15:16:28.527 に答える
2

MP4_ClientStartの2番目のパラメーターは、コールバック関数のアドレスであると想定しています。おそらく問題は、ここでLongとして定義したことです。これはVB6では32ビット値ですが、VB.NETでは64ビット値です。宣言を次のように変更することで、おそらくある程度の成功を収めることができます。

Declare Function MP4_ClientStart Lib "hikclient.dll" _
    (pClientinfo As CLIENT_VIDEOINFO, ByVal abab As Integer) As Integer
于 2010-03-17T15:51:35.123 に答える
0

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)
于 2010-03-17T18:51:08.417 に答える