c dll 在 vb6 上工作正常,但在 vb.net 上出错(尝试读取或写入受保护的内存)
c dll works fine on vb6 but gives error on vb.net (Attempted to read or write protected memory)
我有一个旧的 vb6 程序,我需要在 vb.net
上使用它
我一直在尝试解决这个问题,但无法解决!
我有一个用于读取的 dll 文件和旧的 rfdi 卡 reader(称为 RF20E)
我已经设法让它在阅读卡片上工作,但是当涉及到扇区阅读时它失败了!
这是来自 vb6
的函数声明
Declare Function rf_read_hex Lib "rf20e.dll" (ByVal icdev As Long, ByVal Adr%, ByVal sdata As String) As Integer
这里是 vb6 中的函数调用
Dim databuff32 As String * 32
address = 4
sector = 1
loadmode = 0
st = rf_authentication(ByVal icdev, loadmode, sector)
If st <> 0 Then
M1_label.Caption = "Call rf_authentication() error.Exit!"
Exit Sub
End If
st = rf_read_hex(ByVal icdev, address, databuff32)
If st <> 0 Then
M1_label.Caption = "Call rf_read_hex error.Exit!"
Exit Sub
End If
上面的代码工作得很好
这里是.h库函数
__int16 __stdcall rf_read_hex(HANDLE icdev,unsigned char _Adr, char *_Data);
但是当我尝试在 vb.net 中做同样的事情时,我得到了内存保护错误
这是我的代码
Public Declare Function rf_read_hex Lib "rf20e.dll" (ByVal icdev As Integer, ByVal Adr%, ByRef sdata() As Char) As Short
Dim sector As Integer = 1
Dim address As Integer = 4
Dim loadmode = 0
st = rf_authentication(icdev, loadmode, sector)
st2 = rf_read_hex(icdev, address, databuff32)
rf_authentication 工作正常!
我已经尝试了不同类型的 databuff32 -- byte char string 但我遇到了类型错误或内存错误!
然而,当我将类型设置为:Dim databuff32 As Char
并在减速功能中将参考设置为 ByRef sdata As Char
时,它可以工作但是 !!!!!我只能读取第一个值,没有别的
我很确定问题是字符串 * 32 减速,但我无法修复它!
感谢您的帮助!
您所有的 VB.NET 参数都不正确。 icdev
应该是 IntPtr
,Adr
应该是 Byte
,sdata
应该是 ByVal sdata As Char()
或 ByVal sdata As String
。
此外,在 .NET 中,您应该使用 DllImport
而不是 Declare ... Function
,因为后者仅用于向后兼容 VB6。
试试这个:
<DllImport("rf20e.dll", CharSet:=CharSet.Auto)> _
Public Shared Function rf_read_hex(ByVal icdev As IntPtr, ByVal Adr As Byte, ByVal sdata As Char()) As Short
End Function
有关如何将某些 Win32 类型映射到 .NET 的列表,请参阅我的这个答案:
经过更多尝试我已经解决了我的问题!!!
这是有效的声明:
Public Declare Function rf_read_hex Lib "rf20e.dll" (ByVal icdev As Integer, ByVal adr As Integer, <MarshalAs(UnmanagedType.LPStr)> ByVal sdata As StringBuilder) As Short
这是调用:
Dim databuff32 As New StringBuilder(64)
st2 = rf_read_hex(icdev, address, databuff32)
我有一个旧的 vb6 程序,我需要在 vb.net
上使用它我一直在尝试解决这个问题,但无法解决! 我有一个用于读取的 dll 文件和旧的 rfdi 卡 reader(称为 RF20E) 我已经设法让它在阅读卡片上工作,但是当涉及到扇区阅读时它失败了! 这是来自 vb6
的函数声明Declare Function rf_read_hex Lib "rf20e.dll" (ByVal icdev As Long, ByVal Adr%, ByVal sdata As String) As Integer
这里是 vb6 中的函数调用
Dim databuff32 As String * 32
address = 4
sector = 1
loadmode = 0
st = rf_authentication(ByVal icdev, loadmode, sector)
If st <> 0 Then
M1_label.Caption = "Call rf_authentication() error.Exit!"
Exit Sub
End If
st = rf_read_hex(ByVal icdev, address, databuff32)
If st <> 0 Then
M1_label.Caption = "Call rf_read_hex error.Exit!"
Exit Sub
End If
上面的代码工作得很好
这里是.h库函数
__int16 __stdcall rf_read_hex(HANDLE icdev,unsigned char _Adr, char *_Data);
但是当我尝试在 vb.net 中做同样的事情时,我得到了内存保护错误
这是我的代码
Public Declare Function rf_read_hex Lib "rf20e.dll" (ByVal icdev As Integer, ByVal Adr%, ByRef sdata() As Char) As Short
Dim sector As Integer = 1
Dim address As Integer = 4
Dim loadmode = 0
st = rf_authentication(icdev, loadmode, sector)
st2 = rf_read_hex(icdev, address, databuff32)
rf_authentication 工作正常!
我已经尝试了不同类型的 databuff32 -- byte char string 但我遇到了类型错误或内存错误!
然而,当我将类型设置为:Dim databuff32 As Char
并在减速功能中将参考设置为 ByRef sdata As Char
时,它可以工作但是 !!!!!我只能读取第一个值,没有别的
我很确定问题是字符串 * 32 减速,但我无法修复它!
感谢您的帮助!
您所有的 VB.NET 参数都不正确。 icdev
应该是 IntPtr
,Adr
应该是 Byte
,sdata
应该是 ByVal sdata As Char()
或 ByVal sdata As String
。
此外,在 .NET 中,您应该使用 DllImport
而不是 Declare ... Function
,因为后者仅用于向后兼容 VB6。
试试这个:
<DllImport("rf20e.dll", CharSet:=CharSet.Auto)> _
Public Shared Function rf_read_hex(ByVal icdev As IntPtr, ByVal Adr As Byte, ByVal sdata As Char()) As Short
End Function
有关如何将某些 Win32 类型映射到 .NET 的列表,请参阅我的这个答案:
经过更多尝试我已经解决了我的问题!!!
这是有效的声明:
Public Declare Function rf_read_hex Lib "rf20e.dll" (ByVal icdev As Integer, ByVal adr As Integer, <MarshalAs(UnmanagedType.LPStr)> ByVal sdata As StringBuilder) As Short
这是调用:
Dim databuff32 As New StringBuilder(64)
st2 = rf_read_hex(icdev, address, databuff32)