我使用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
望各位看到帖子的朋友费费心,很急,多谢大家了
4 回答
桃花长相依
TA贡献1860条经验 获得超8个赞
ByRef dataBuf As String
还得指定 CharSet.
char* 在 C++ 是指以 /0 结尾的字符串,也可以表示 char[] 数组(定长字符串).
因为C++中没有 byte,所以字节值用 char 表示.
如果以string 读取无法成功,就说明 char* 代表的是定长字符串,那么你就需要用C#中的byte[] 来接收定长字符串数组,然后再转换成string.
Smart猫小萌
TA贡献1911条经验 获得超7个赞
还是读不出来,块地址_Adr应该定义为什么类型,按照文档上说MF卡的4-15数据块都是可读写的。但为什么要报“尝试读取或写入受保护的内存”的错或是返回应答码正确,但_Data却没有值呢
眼眸繁星
TA贡献1873条经验 获得超9个赞
@诚实小郎君:如果 C++ 的函数原形定义为 char *_Data ,那么就是要求调用方传入有效的char[]数组,同时函数原形还应该提供一个入参 int size,该传入参数指示你传入的char[]的长度,你防止函数在char*++时越界。如果函数原形定义为char& _Data ,那就是告诉你,它会为你分配一个char[] 数组,同时它还要提供一个传出参数,int& size,告诉你它分配了多大的char数组,以防止你使用时越界。
- 4 回答
- 0 关注
- 419 浏览
添加回答
举报
0/150
提交
取消