首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“addressof”VB6 to VB.NET

“addressof”VB6 to VB.NET
EN

Stack Overflow用户
提问于 2010-03-17 23:11:33
回答 4查看 7.9K关注 0票数 6

我在将我的VB6项目转换为VB.NET时遇到一些问题

我不明白这个"AddressOf“函数怎么会出现在VB.NET中

我的VB6代码:

代码语言:javascript
复制
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)
EN

回答 4

Stack Overflow用户

发布于 2010-03-17 23:58:55

您可能会看到以下错误:

Long 'AddressOf‘表达式不能转换为'Long’,因为'Long‘不是委托类型。

您可能想要做的是创建一个委托,然后将adab的类型更改为该委托类型。将此代码添加到类中:

代码语言:javascript
复制
Public Delegate Sub ReadDataCallBackDelegate(ByVal nPort As Long, _
  ByVal pPacketBuffer As Byte, ByVal nPacketSize As Long)

然后将您的P/Invoke声明更改为:

代码语言:javascript
复制
Declare Function MP4_ClientStart Lib "hikclient.dll" (ByVal pClientinfo As _
  CLIENT_VIDEOINFO, ByVal abab As ReadDataCallBackDelegate) As Long

请勿删除/更改您的ReadDataCallBack订阅,您仍需要该订阅。

在这一点上,编译器应该很高兴。然而,其他人提出的观点很重要。Integer和Long的长度在VB6和VB.NET中是不同的,所以在.NET中,每当你在VB6中使用Long时,都需要使用Integer。

票数 5
EN

Stack Overflow用户

发布于 2010-03-17 23:16:29

关于非托管代码中的回调,请查看类似的post是否对您有帮助。

关于你的问题-我不认为你需要回调函数或者你发布的例子不正确/完整-请参阅上面指出的帖子并澄清你的代码样本。

票数 3
EN

Stack Overflow用户

发布于 2010-03-17 23:51:35

我假设MP4_ClientStart的第二个参数应该是回调函数的地址。可能的问题是,您在这里将其定义为Long,在VB6中是一个32位的值,但在VB.NET中是一个64位的值。通过将声明更改为:

代码语言:javascript
复制
Declare Function MP4_ClientStart Lib "hikclient.dll" _
    (pClientinfo As CLIENT_VIDEOINFO, ByVal abab As Integer) As Integer
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2463395

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档