首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C dll在vb6上运行良好,但在vb.net (试图读取或写入受保护内存)上出现错误。

C dll在vb6上运行良好,但在vb.net (试图读取或写入受保护内存)上出现错误。
EN

Stack Overflow用户
提问于 2017-11-27 09:29:35
回答 2查看 111关注 0票数 1

我有一个旧的vb6程序,我需要在vb.net上使用它

我一直在试图解决这个问题,但没能解决!我有一个读取dll文件和旧的rfdi读卡器(RF20E,它的名字),我管理它工作在读卡,但当涉及到扇区读取,它失败!下面是来自vb6的函数声明

代码语言:javascript
复制
Declare Function rf_read_hex Lib "rf20e.dll" (ByVal icdev As Long, ByVal Adr%, ByVal sdata As String) As Integer

下面是vb6中的函数调用

代码语言:javascript
复制
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库函数

代码语言:javascript
复制
__int16 __stdcall rf_read_hex(HANDLE icdev,unsigned char _Adr, char *_Data);

但是,当我尝试在vb.net中做同样的事情时,我会得到保护内存错误。

这是我的密码

代码语言:javascript
复制
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减速,但我无法修复它!

谢谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-27 12:06:54

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

下面是有效的声明:

代码语言:javascript
复制
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

下面是我们的号召:

代码语言:javascript
复制
Dim databuff32 As New StringBuilder(64)
st2 = rf_read_hex(icdev, address, databuff32)
票数 1
EN

Stack Overflow用户

发布于 2017-11-27 09:50:37

所有VB.NET参数都不正确。icdev应该是IntPtrAdr应该是Bytesdata应该是ByVal sdata As Char()ByVal sdata As String

另外,在.NET中,您应该使用DllImport而不是Declare ... Function,因为后者只存在于与VB6的向后兼容性。

试试这个:

代码语言:javascript
复制
<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的列表,请参阅我的答案

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47507605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档