我在用VB6编写读写非接触式IC卡的程序中,遇到一个情况:就是我从卡中读取块数据时,返回值有时会丢失字符,不知如何处理?
附:Dll库的函数说明
int _stdcall MF_HL_Read(int DeviceAddr, unsigned char block, unsigned char *buffer);
功能:高级读卡函数
参 数: DeviceAddr: 设备地址,0 对所有设备有效。
block: 操作块号,0~63(S50)或0~255(S70)。
buffer:返回块数据,16个字节
返 回:成功则返回 0。
我转换成VB的函数说明:
'功能: 高级读卡函数
'参 数: DeviceAddr: 设备地址,0 对所有设备有效。
' block: 操作块号,0~63(S50)或0~255(S70)。
' buffer:返回块数据,16个字节
'返 回:成功则返回 0。
Public Declare Function MF_HL_Read Lib "mf32" (ByVal DeviceAddr As Integer, ByVal block As Byte, ByVal buffer As String) As Integer
我调用函数后,字符串buffer的值如果碰到带有chr(&HE0)字符或其它以字节值以E开头的字符时,会丢失字符。经我处理成十六进制字节时,达不到16个。
我改了函数说明:
Public Declare Function MF_HL_Read Lib "mf32" (ByVal DeviceAddr As Integer, ByVal block As Byte, ByRef buffer() As Byte) As Integer
函数可以执行,但是buffer()数组没有返回值,传址不成功。
哪位高手帮帮我。
我举个例子:
Private Sub Command1_Click()
Dim st As String
st = ChrB(&H0) & ChrB(&H11) & ChrB(&H22) & ChrB(&H33) & ChrB(&H44)
st = st & ChrB(&H55) & ChrB(&H66) & ChrB(&H77) & ChrB(&H88)
st = st & ChrB(&H99) & ChrB(&HAA) & ChrB(&HBB) & ChrB(&HCC)
st = st & ChrB(&HDD) & ChrB(&HEE) & ChrB(&HFF)
st = StrConv(st, vbUnicode) 'VB6调用过程中自动转换,我们没法更改。
'我用st来模拟调用动态库函数后返回来的字符串。
Text1.Text = getHex(st)
'经处理后,值变成"00 11 22 33 44 55 66 77 88 99 AA BB CC DD 3F"
'而不是 "00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF"
'在以E开头的字符处丢失字符。
End Sub
Private Function getHex(ByVal strOld As String) As String
Dim i As Integer
Dim strTemp As String
Dim strNew As String
'假如VB6不自动转换字符串,我这步转换可省去,则结果是对的,问题是VB6
'返回来的值已经转成Unicode字符了,所以没办法,只得转换回来。
strOld = StrConv(strOld, vbFromUnicode)
For i = 1 To LenB(strOld)
strTemp = Hex(AscB(MidB(strOld, i, 1)))
If Len(strTemp) < 2 Then
strTemp = "0" & strTemp
End If
strNew = strNew & strTemp & " "
Next i
getHex = Left(strNew, Len(strNew) - 1)
End Function