我有一个旧的VB6程序,我需要在vb.net上使用它
我一直在尝试解决此问题,但无法修复它!我有一个用于阅读的DLL文件和旧的RFDI读取器(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-字节char字符串,但我要么遇到类型错误或内存错误!
但是,当我将类型设置为: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:https://stackoverflow.com/a/46547553/3740093
在进行了更多尝试之后,我解决了我的问题!!!
这是有效的声明:
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)