我有一个旧的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 -字节字符字符串,但是我要么收到类型错误,要么收到内存错误!
但是,当我将类型设置为:Dim databuff32 As Char和在减速函数中将引用设置为ByRef sdata As Char时,它可以工作,但是!我只能读第一个值,别的什么也看不出来。
我很确定问题是字符串* 32减速,但我无法修复它!
谢谢你的帮助!
发布于 2017-11-27 12:06:54
经过更多的尝试,我解决了我的问题!
下面是有效的声明:
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)发布于 2017-11-27 09:50:37
所有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的列表,请参阅我的答案
https://stackoverflow.com/questions/47507605
复制相似问题