VB2005操作D8读卡器

我使用vb2005调用德卡提供的dll读取卡内信息时遇到了2个问题
一是在读某些块地址时,会报“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”
二是当返回到应答码为读取成功时,却接收不到任何数据

德卡提供的API里dll中读取卡内信息的函数定义为:

int dc_read(int icdev,unsigned char _Adr,unsigned char *_Data);

 

 


这里_Data就是返回数据的地方
我在vb2005中声明的函数为

 

Private Declare Function dc_read Lib "dcrf32.dll" (ByVal icdev As Integer, ByVal _adr As Char, ByRef dataBuf As String) As Integer


自定义读卡的函数为:

'读取单程票数据
Public Function ReadTkt() As Boolean
Dim st As Integer '读取结果
ReadTkt = False

frmCardReader.Log(
"开始读单程票数据...")
'单程票共占用48字节
Try
'读发行区,8字节
st = dc_read(icdev, ChrW(4), dataBuf)
If (st <> 0) Then ' 读卡失败
frmCardReader.Log("读取单程票(发行区)信息失败")
Exit Function
End If
'读发行区信息成功,截取dataBuf,转换为需要的数据
frmCardReader.Log("读取单程票(发行区)信息成功:" & dataBuf)
Catch ex As Exception
ReadTkt
= False
frmCardReader.Log(ex.Message)
MsgBox("读单程票失败,错误代码:[" & st & "]")
End Try
End Function

 

 


望各位看到帖子的朋友费费心,很急,多谢大家了

慕斯王
浏览 420回答 4
4回答

桃花长相依

ByRef dataBuf As String 还得指定 CharSet. char* 在 C++ 是指以 /0 结尾的字符串,也可以表示 char[] 数组(定长字符串). 因为C++中没有 byte,所以字节值用 char 表示. 如果以string 读取无法成功,就说明 char* 代表的是定长字符串,那么你就需要用C#中的byte[] 来接收定长字符串数组,然后再转换成string.

Smart猫小萌

还是读不出来,块地址_Adr应该定义为什么类型,按照文档上说MF卡的4-15数据块都是可读写的。但为什么要报“尝试读取或写入受保护的内存”的错或是返回应答码正确,但_Data却没有值呢

眼眸繁星

@诚实小郎君:如果 C++ 的函数原形定义为 char *_Data ,那么就是要求调用方传入有效的char[]数组,同时函数原形还应该提供一个入参 int size,该传入参数指示你传入的char[]的长度,你防止函数在char*++时越界。如果函数原形定义为char& _Data ,那就是告诉你,它会为你分配一个char[] 数组,同时它还要提供一个传出参数,int& size,告诉你它分配了多大的char数组,以防止你使用时越界。
打开App,查看更多内容
随时随地看视频慕课网APP