| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1690 人关注过本帖
标题:VB 调用c编写的dll 读取身份证阅读器的身份证信息出现全是方框乱码
只看楼主 加入收藏
hj213204
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2021-8-29
结帖率:0
收藏
已结贴  问题点数:20 回复次数:4 
VB 调用c编写的dll 读取身份证阅读器的身份证信息出现全是方框乱码
Private Type TwoIdInfoStructEx                              '这个结构体是读取的身份证信息   调用的C语言编写的 readCardInfo.dll 里面的信息
    arrTwoIdName As String * 30            '姓名 UNICODE
    arrTwoIdSex As String * 2               '性别 UNICODE
    arrTwoIdNation As String * 4            '民族 UNICODE
    arrTwoIdBirthday As String * 16         '出生日期 UNICODE YYYYMMDD
    arrTwoIdAddress As String * 70               '住址 UNICODE
    arrTwoIdNo As String * 36               '身份证号码 UNICODE
    arrTwoIdSignedDepartment As String * 30 '签发机关 UNICODE
    arrTwoIdValidityPeriodBegin As String * 16 '有效期起始日期 UNICODE YYYYMMDD
    arrTwoIdValidityPeriodEnd As String * 16   '有效期截止日期 UNICODE YYYYMMDD 有效期为长期时存储“长期”
   
    arrTwoOtherNO As String * 18            '通行证类号码
    arrTwoSignNum As String * 4             '签发次数
    arrTwoRemark1 As String * 6             '预留区
    arrTwoType As String * 2                '证件类型标识
    arrTwoRemark2 As String * 6             '预留区
   
    arrTwoIdNewAddress As String * 70       '最新住址 UNICODE
    arrReserve As String * 2                '保留字节 字节对齐用
    arrTwoIdPhoto As String * 1024          '照片信息
    arrTwoIdFingerprint As String * 1024    '指纹信息
    arrTwoIdPhotoJpeg As String * 4096      '照片信息 JPEG 格式
    unTwoIdPhotoJpegLength As Long          '照片信息长度 JPEG格式
End Type
Private Declare Sub setDeviceType Lib "readCardInfo.dll" (ByVal nDeviceType As Long)
Private Declare Function cardOpenDevice Lib "readCardInfo.dll" (ByVal nouttime As Long, ByVal nDeviceNo As Long) As Long
Private Declare Function setCardType Lib "readCardInfo.dll" (ByVal nDeviceHandle As Long, ByVal ctype As Long) As Boolean
Private Declare Function cardReadTwoCard Lib "readCardInfo.dll" (ByVal nDeviceHandle As Long, ByVal cardCB As Long, ByVal szFactoryFlag As String, ByVal szServerIp As String, ByVal nServerPort As Long, ByRef cardinfo As TwoIdInfoStructEx, ByVal bTest As Boolean) As Boolean   'ByRef cardinfo As TwoIdInfoStructEx,
Private Declare Function cardCloseDevice Lib "readCardInfo.dll" (ByVal nDeviceHandle As Long) As Long
Private Declare Function decodeCardImage Lib "readCardInfo.dll" (ByVal srcimage As String, ByVal outimage As String, outlen As Long) As Boolean
Private Declare Function cardBeep Lib "readCardInfo.dll" (ByVal nDeviceHandle As Long) As Long
' 说明:这个是网上买了一个读取身份证阅读器的硬件 对方提供的DEMO有问题,给的开发文档就是用到上面的函数
' 目前用官方提供的exe能读出身份证信息。但是用DEMO源文件 修改为自己想要的程序就不行 主要是读取的是乱码
'----------- 点击窗口按钮读取身份证阅读器的信息--------------------------------------------------------------------------------------------
Private Sub Command1_Click()
    Dim a As Long, b As Boolean, c As Boolean, tmpCardInfo As TwoIdInfoStructEx
    Dim sss, str As String
    Dim I As Intege

    setDeviceType (1)                '按开发文档要求  第一步先设置设备工作模式  传入参数 1 表示离线工作模式

    a = cardOpenDevice(2, 1001)      '第二步 设置打开设备第一个参数2是超时时间  第二个参数1001是设备号  返回句柄给a  接上硬件 放上身份证 单步调试能读取到设备句柄 表示设备已打开

    If a > 0 Then                    '如果设备没有成功打开 a = -1   
        c = setCardType(a, 1)        '第三步 设备打开后 将句柄传入 设置读卡类型,第二个参数为1 代表读身份证
        b = cardReadTwoCard(a, 0, "99ffb2f98a29071107c7a09ad2c6d096", "id., 8848, tmpCardInfo, False)  '  倒数第二个参数 tmpCardInfo  传入结构体地址   读取成功返回true  测试时,放上身份证 的确返回true 表示正常
        '以下是重点
        sss = StrConv(tmpCardInfo.arrTwoIdName, vbFromUnicode)    '给的demo 用这个语句转换字符  单步调试 光标移到  tmpCardInfo.arrTwoIdName  显示的全是小方块"口口口,,,,口口口"  就是这个结构体的值不对
        ReDim outArray(Len(tmpCardInfo))   '由于读取不出正确的值,我又新定义了一个数组 想通过把结构体内容拷贝到数组,再查看数组的内容
        CopyMemory outArray(0), tmpCardInfo, Len(tmpCardInfo) '将结构的信息拷贝到数组中.
        For I = 0 To 52 Step 2
            sss = sss & outArray(I) & " / " & outArray(I + 1) & vbCrLf       '把前面 tmpCardInfo.arrTwoIdName    tmpCardInfo.arrTwoIdSex 的内容放到数组内   结果全是0
       Next I
       Call cardCloseDevice(a)    '关闭读卡设备
    End If
End Sub
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'现在的现象就是硬件能打开关闭,能读到卡,也能读到数据,就是数据全是小方块 查阅了些资料,不知道是不是 C语言开发的结构体的变量和VB这边字节宽度对不上造成的乱码,但是不知道怎么解决
'有没有高手能指点 指点,小弟感激不尽!感谢各位!  QQ:774659002
'-----------------下面的结构体是给的开发文档中用C语言编写的部分 都是UNICODE 解码出来就不对 ------------------------------------------
身份证解码结果
typedef struct TwoIdInfoStructEx
{
    char arrTwoIdName[30];                    //姓名 UNICODE
    char arrTwoIdSex[2];                    //性别 UNICODE
    char arrTwoIdNation[4];                    //民族 UNICODE
    char arrTwoIdBirthday[16];                //出生日期 UNICODE YYYYMMDD
    char arrTwoIdAddress[70];                //住址 UNICODE
    char arrTwoIdNo[36];                    //身份证号码 UNICODE
    char arrTwoIdSignedDepartment[30];        //签发机关 UNICODE
    char arrTwoIdValidityPeriodBegin[16];    //有效期起始日期 UNICODE YYYYMMDD
    char arrTwoIdValidityPeriodEnd[16];        //有效期截止日期 UNICODE YYYYMMDD 有效期为长期时存储“长期”

    char arrTwoOtherNO[18]; // 通行证类号码
    char arrTwoSignNum[4];        // 签发次数
    char arrTwoRemark1[6];    // 预留区
    char arrTwoType[2];        // 证件类型标识
    char arrTwoRemark2[6];    // 预留区

    char arrTwoIdNewAddress[70];            //最新住址 UNICODE
    char arrReserve[2];                        //保留字节 字节对齐用
    unsigned char arrTwoIdPhoto[1024];        //照片信息
    unsigned char arrTwoIdFingerprint[1024];//指纹信息
    unsigned char arrTwoIdPhotoJpeg[4096];    //照片信息 JPEG 格式
    unsigned int  unTwoIdPhotoJpegLength;    //照片信息长度 JPEG格式
};
搜索更多相关主题的帖子: 信息 ByVal Long char String 
2021-08-29 23:48
hj213204
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2021-8-29
收藏
得分:0 
有没有开发身份证阅读器的朋友啊
2021-08-31 13:42
hnhhzhb1977
Rank: 2
等 级:论坛游民
威 望:1
帖 子:18
专家分:19
注 册:2021-9-2
收藏
得分:7 
没有做过这个,手头没资料,但经常提取各种存档文件,所以也需定义headinfo类,这个东西只要定义的与原文件不一致,就会是你说的那个——乱码,所以应该是结构体定义出现问题了。你既然有官方提供的exe,可以反编译看它是怎么定义的。
2021-09-05 07:42
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4940
专家分:30047
注 册:2008-10-15
收藏
得分:7 
查了一个 StrConv 函数说明,

如果左边是字符串变量,那么右边如果是 ANSI 数组时 ,使用 StrConv 函数。
如果右边是 UNICODE 数组时,直接使用 等号 。

你可以试一下看看。

授人于鱼,不如授人于渔
早已停用QQ了
2021-09-05 12:35
约定的童话
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:56
帖 子:246
专家分:1442
注 册:2021-8-1
收藏
得分:7 
最近在研究VB调用百度AI识别图片的功能,感兴趣的可以一起研究下https://www.

[此贴子已经被作者于2021-9-5 14:27编辑过]

2021-09-05 13:09
快速回复:VB 调用c编写的dll 读取身份证阅读器的身份证信息出现全是方框乱码
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017182 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved