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 应该是 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 的列表,请参阅我的这个答案:

经过更多尝试我已经解决了我的问题!!!

这是有效的声明:

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)