C DLL在VB6上工作正常,但在VB.NET上出现错误(尝试读取或写下受保护的内存)



我有一个旧的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应该是IntPtrAdr应该是Bytesdata应该是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)

最新更新