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格式
};