瑞星卡卡安全论坛

首页 » 技术交流区 » 系统软件 » 哪位高手帮帮我:VB调用C动态库函数遇到的问题。【求助】
小蔡一蝶 - 2006-2-5 9:26:00
我在用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
1
查看完整版本: 哪位高手帮帮我:VB调用C动态库函数遇到的问题。【求助】