今天拿到手一个新中新二代证阅读器,经销商说是给一个SDK开发包,但是里面只有VC,delphi的实例代码,看不懂。
不知道有没有老大曾经做过类似的项目,可否共享一下,事成后,一定另外开帖把所有分数送上。

解决方案 »

  1.   

    没见过,你可以把vc或delphi的翻译成vb的,或者直接就用他们提供的附加你的功能
      

  2.   

    主要就看sdk帮助和示例代码了 努力去看怎么调用的就好了
      

  3.   

    原来他们的SDK包已经包含了一个DLL文件,只要在Vb中申明一下就行了。但是里面包括了一个结构体还有关于指针、引用调用等操作,不熟练所以一直弄不出来,哪位兄弟能否帮一把,帮我把C语言的翻译成VB。下面是这个Syn_IDCardRead.dll的源代码,我定义了两个函数测试可以通过,可其它的就不会弄了。Syn_IDCardRead.h内容如下:#ifdef  _WIN32
    #define STDCALL  __stdcall
    #else
    #define STDCALL
    #endif
    #ifndef SDTAPI_
    #define SDTAPI_
    #ifdef __cplusplus
    extern "C"{
    #endif #pragma pack(1)
    typedef struct tagIDCardData{
    char Name[32];
    char Sex[4];
    char Nation[6];
    char Born[18];
    char Address[72];
    char IDCardNo[38];
    char GrantDept[32];
    char UserLifeBegin[18];
    char UserLifeEnd[18];
    char reserved[38];
    char PhotoFileName[255];
    }IDCardData;#pragma pack()/**********************************************************
     ********************** 端口类API *************************
     **********************************************************/
    int STDCALL Syn_GetCOMBaud(int iComID,unsigned int *puiBaud);
    int STDCALL Syn_SetCOMBaud(int iComID,unsigned int  uiCurrBaud,unsigned int  uiSetBaud);
    int STDCALL Syn_OpenPort(int iPortID);
    int STDCALL Syn_ClosePort(int iPortID);/**********************************************************
     ********************** SAM类API **************************
     **********************************************************/
    int STDCALL Syn_GetSAMStatus(int iPortID,int iIfOpen);
    int STDCALL Syn_ResetSAM(int iPortID,int iIfOpen);
    int STDCALL Syn_GetSAMID(int iPortID,unsigned char *pucSAMID,int iIfOpen);
    int STDCALL Syn_GetSAMIDToStr(int iPortID,char *pcSAMID,int iIfOpen);/**********************************************************
     ******************* 身份证卡类API ************************
     **********************************************************/
    int STDCALL Syn_StartFindIDCard(int iPortID,unsigned char *pucManaInfo,int iIfOpen);
    int STDCALL Syn_SelectIDCard(int iPortID,unsigned char *pucManaMsg,int iIfOpen);
    int STDCALL Syn_ReadMsg(int iPortID,int iIfOpen,IDCardData *pIDCardData);/**********************************************************
     ******************* 附加类API ************************
     **********************************************************/
    int  STDCALL Syn_SendSound(int iCmdNo);
    void STDCALL Syn_DelPhotoFile();#ifdef __cplusplus
    }
    #endif 
    #endif
      

  4.   

    Public Type tagIDCardData
    Name As String * 32
    Sex As String * 4
    Nation As String * 6
    Born As String * 18
    Address As String * 72
    IDCardNo As String * 38
    GrantDept As String * 32
    UserLifeBegin As String * 18
    UserLifeEnd As String * 18
    reserved As String * 38
    PhotoFileName As String * 255
    End Type
      

  5.   

    Public Declare Function Syn_GetCOMBaud Lib "dll" (ByVal iComID As Long, ByRef puiBaud As Long) As Long
    ...................
      

  6.   

    能请你帮我把这三个函数一起翻译一下吗?int STDCALL Syn_StartFindIDCard(int iPortID,unsigned char *pucManaInfo,int iIfOpen);
    int STDCALL Syn_SelectIDCard(int iPortID,unsigned char *pucManaMsg,int iIfOpen);
    int STDCALL Syn_ReadMsg(int iPortID,int iIfOpen,IDCardData *pIDCardData);
      

  7.   

    Private Declare Function Syn_StartFindIDCard Lib "aa" (byvaliPortID As Long, ByRef pucManaInfo As String, ByVal iIfOpen As Long) As Long
    Private Declare Function Syn_SelectIDCard Lib "aa" (ByVal iPortID As Long, ByRef pucManaMsg As String, ByVal iIfOpen As Long) As Long
    Private Declare Function Syn_ReadMsg Lib "aa" (ByVal iPortID As Long, ByVal iIfOpen As Long, ByRef pIDCardData As Any) As Long
      

  8.   

    月亮,我想请问一下。为什么每次打开端口都正确了,但是用Syn_StartFindIDCard函数时,却总是返回不正确。我把代码贴出来,还请指点一下。Private Declare Function Syn_OpenPort Lib "Syn_IDCardRead.dll" (ByVal iPortID As Long) As Long
    Private Declare Function Syn_ClosePort Lib "Syn_IDCardRead.dll" (ByVal iPortID As Long) As LongPrivate Declare Function Syn_StartFindIDCard Lib "Syn_IDCardRead.dll" (ByVal iPortID As Long, ByRef pucManaInfo As String, ByVal iIfOpen As Long) As Long
    Private Declare Function Syn_SelectIDCard Lib "Syn_IDCardRead.dll" (ByVal iPortID As Long, ByRef pucManaMsg As String, ByVal iIfOpen As Long) As Long
    Private Declare Function Syn_ReadMsg Lib "Syn_IDCardRead.dll" (ByVal iPortID As Long, ByVal iIfOpen As Long, ByRef pIDCardData As Any) As Long
    Private Type tagIDCardData
        Name As String * 32
        Sex As String * 4
        Nation As String * 6
        Born As String * 18
        Address As String * 72
        IDCardNo As String * 38
        GrantDept As String * 32
        UserLifeBegin As String * 18
        UserLifeEnd As String * 18
        reserved As String * 38
        PhotoFileName As String * 255
    End Type
        
    Private Sub Command1_Click()
    Dim ifOpen As Integer
    Dim iPort As Integer
    Dim iRet As Integer
    Dim pucIIN As String * 4
    Dim pucSN As String * 8
    Dim CardMsg As tagIDCardDataifOpen = 0
    iPort = 1
    iRet = Syn_OpenPort(iPort)
    pucIIN = Space(4)
    pucSN = Space(8)
    MsgBox iRet
    If iRet = 0 Then
        iRet = Syn_StartFindIDCard(iPort, pucIIN, iffopen)//这里总是返回-3而不是0,不知道是不是哪里定义有问题    MsgBox iRet
        Syn_ClosePort iPort
    End If
    End Sub
      

  9.   

    0  操作成功或相片解码正确
    -1 端口打开失改/端口尚未打开/端口号不合法
    -2 证/卡中此项无内容
    -3 PC接收超时,在规定的时间内未接收到规定长度的数据
    -4 数据传输错误
    -5 该SAM_V串口不可用,只在SDT_GetCOMBaud时才有可能返回。
    -6 接收业务终端数据的校验和错
    -7 接收业务终端数据的长度错
    -8 接收业务终端的命令错误,包括命令中的各种数值或逻辑搭配错误
    -9 越权操作
    -10 无法识别的错误
    -11 寻找证/卡失败
    -12 选取证/卡失败
    -13 调用sdtapi.dll错误
    -14 相片解码错误
    -15 授权文件不存在
    -16 设备连接错误
      

  10.   

    //这是文档里带着的一个VC的例子void CSampleDlg::OnButton1()
    { //TODO:Add your control notification handler code here
      int ifOpen;
      int iPort;
      int iRet;
      unsigned char pucIIN[4];
      unsigned char pucSN[8];
      IDCardData CardMsg;
      ifOpen=0;//是否需要打开串口
      iPort=1;
      iRet=Syn_OpenPort(iPort);
      if(iRet==0) 
       { iRet=Syn_StartFindIDCard(iPort,pucIIN,ifOpen);
         if(iRet==0)
         { iRet=Syn_SelectIDCard(iPort,pucSN,ifOpen)
           if(iRet==0)
            { iRet=Syn_ReaMsg(iPort,0,&CardMsg);
              if(iRet==0)
                 { //显示读出的信息
                   UpdateData(true);
                   m_name-CardMsg.Name;
                   UpdateData(false);
                   Syn_SendSound(0);
                   Syn_DelPhotoFile();
                    }
             }
              
          }
         
       }
       Syn_ClosePort(iPort);
    }
      

  11.   

    你说的阅读器我没用过,不过SDK是弄过。一般的SDK都提供VC、VB、DELPHI等演示。你的没有,建议你将DELPHI示例改成VB的。个人感觉,相对从VC转容易一些。═══════════════════
    http://www.egooglet.com 资料、源码下载http://bbs.j2soft.cn 论坛交流
    ═══════════════════
      

  12.   

    狼大哥,现在是这样一个问题,请帮忙看一下C中是这样定义的:
    int STDCALL Syn_StartFindIDCard(int iPortID,unsigned char *pucManaInfo,int iIfOpen);
    调用时:
    int ifOpen;
    int iPort;
    int iRet;
    unsigned char pucIIN[4];
    ifOpen=0;//是否需要打开串口
    iPort=1;
    iRet=Syn_StartFindIDCard(iPort,pucIIN,ifOpen);而翻译成VB后我是这样定义的:
    Private Declare Function Syn_StartFindIDCard Lib "Syn_IDCardRead.dll" (ByVal iPortID As Long, ByRef pucManaInfo As String, ByVal iIfOpen As Long) As Long调用时:
    Dim ifOpen As Integer
    Dim iPort As Integer
    Dim iRet As Integer
    Dim pucIIN As String * 4
    ifOpen = 0
    iPort = 1
    pucIIN = Space(4) '在网上搜了很久,说要给这个字符串赋一个初始值。
    iRet = Syn_StartFindIDCard(iPort, pucIIN, ifOpen)//这里总是返回-3而不是0,不知道是不是参数定义有问题错误代误说明:-3 PC接收超时,在规定的时间内未接收到规定长度的数据
      

  13.   

    在VB里面引用这个DLL对象,然后DIM XX AS NEW ......
    再后来就看里面提供的方法和属性等了
      

  14.   

    Private   Declare   Function   Syn_OpenPort   Lib   "Syn_IDCardRead.dll "   (ByVal   iPortID   As   Long)   As   Long 
    Private   Declare   Function   Syn_ClosePort   Lib   "Syn_IDCardRead.dll "   (ByVal   iPortID   As   Long)   As   Long Private   Declare   Function   Syn_StartFindIDCard   Lib   "Syn_IDCardRead.dll "   (ByVal   iPortID   As   Long,   ByRef   pucManaInfo   As   String,   ByVal   iIfOpen   As   Long)   As   Long 
    Private   Declare   Function   Syn_SelectIDCard   Lib   "Syn_IDCardRead.dll "   (ByVal   iPortID   As   Long,   ByRef   pucManaMsg   As   String,   ByVal   iIfOpen   As   Long)   As   Long 
    Private   Declare   Function   Syn_ReadMsg   Lib   "Syn_IDCardRead.dll "   (ByVal   iPortID   As   Long,   ByVal   iIfOpen   As   Long,   ByRef   pIDCardData   As   Any)   As   Long 
    Private   Type   tagIDCardData 
            Name   As   String   *   32 
            Sex   As   String   *   4 
            Nation   As   String   *   6 
            Born   As   String   *   18 
            Address   As   String   *   72 
            IDCardNo   As   String   *   38 
            GrantDept   As   String   *   32 
            UserLifeBegin   As   String   *   18 
            UserLifeEnd   As   String   *   18 
            reserved   As   String   *   38 
            PhotoFileName   As   String   *   255 
    End   Type 
            
    Private   Sub   Command1_Click() 
    Dim   ifOpen   As   Integer 
    Dim   iPort   As   Integer 
    Dim   iRet   As   Integer 
    Dim   pucIIN   As   String   *   4 
    Dim   pucSN   As   String   *   8 
    Dim   CardMsg   As   tagIDCardData ifOpen   =   0 
    iPort   =   1 
    iRet   =   Syn_OpenPort(iPort) 
    pucIIN   =   Space(4) 
    pucSN   =   Space(8) 
    MsgBox   iRet 
    If   iRet   =   0   Then 
            iRet   =   Syn_StartFindIDCard(iPort,   pucIIN,   iffopen)//这里总是返回-3而不是0,不知道是不是哪里定义有问题         MsgBox   iRet 
            Syn_ClosePort   iPort 
    End   If 
    End   Sub现附上SDK全部内容,麻请各位高手帮我看看是怎么回事!谢谢
    1. 端口类API
      int  Syn_OpenPort(int iPortID);
      说明: 打开串口/USB口  参数:iPortID [in] 整数,表示端口号。1-16(十进制)为串口,1001-1016(十进制)为USB口,缺省的一个USB设备端口号是1001。  返回值:成功返回0,错误返回见6。  int  Syn_ClosePort(int iPortID);
      说明: 关闭串口/USB口  参数:iPortID [in] 整数,表示端口号。  返回值:成功返回0,错误返回见6。
      
      int  Syn_GetCOMBaud(int iComID,unsigned int *puiBaudRate);
    说明: 查看串口的波特率  参数:iPort [in] 整数,表示端口号。此处端口号必须为1-16,表示串口,参见7.1。 puiBaudRate [out] 无符号整数指针,指向普通串口当前波特率, 默认情况下为            115200。  返回值:成功返回0,错误返回见6。  int  Syn_SetCOMBaud(int iComID,unsigned int  uiCurrBaud,unsigned int  uiSetBaud);
      说明: 设置串口的波特率  参
      返回值:成功返回0,错误返回见6。2. SAM类API
    int  Syn_GetSAMStatus(int iPortID,int iIfOpen);
      说明: 对SAM_V进行状态检测   参数:iPort [in] 整数,表示端口号。参见7.1。 
    iIfOpen [in] 整数,参见7.2。返回值:成功返回0,错误返回见6。int  Syn_ResetSAM(int iPortID,int iIfOpen);
    说明: 对SAM_V复位参数:iPort [in] 整数,表示端口号。参见7.1。 
    iIfOpen [in] 整数,参见7.2。返回值:成功返回0,错误返回见6。  int  Syn_GetSAMID(int iPortID,unsigned char *pucSAMID,int iIfOpen);
    说明: 读取SAM_V的编号(十六进制)  参数:iPort [in] 整数,表示端口号。参见7.1。 
    pucSAMID [out] 无符号字符串指针,SAM_V编号,16字节。
    iIfOpen [in] 整数,参见7.2。返回值:成功返回0,错误返回见6。
      
      int  Syn_GetSAMIDToStr(int iPortID,char *pcSAMID,int iIfOpen);
    说明: 读取SAM_V的编号(字符串格式)参数:iPort [in] 整数,表示端口号。参见7.1。 
    pcSAMID [out] 字符串指针,SAM_V编号。 
    iIfOpen [in] 整数,参见7.2。返回值:成功返回0,错误返回见6。3. 身份证卡类API
      int  Syn_StartFindIDCard(int iPortID,unsigned char *pucManaInfo,int iIfOpen);
    说明: 开始找卡  参数:iPort [in] 整数,表示端口号。参见7.1。 
    pucManaInfo [out] 无符号字符指针,证/卡芯片管理号,4个字节。 
    iIfOpen [in] 整数,参见7.2。返回值:成功返回0,错误返回见6。  
    int  Syn_SelectIDCard(int iPortID,unsigned char *pucManaMsg,int iIfOpen);
    说明: 选卡  参数:iPort [in] 整数,表示端口号。参见7.1。 
    pucManaMsg [out] 无符号字符指针,证/卡芯片序列号,8个字节。 
    iIfOpen [in] 整数,参见7.2。返回值:成功返回0,错误返回见6。  int  Syn_ReadMsg(int iPortID,int iIfOpen,IDCardData *pIDCardData);
    说明: 读取证/卡信息  参数:iPort [in] 整数,表示端口号。参见7.1。 
    iIfOpen [in] 整数,参见7.2。
    pIDCardData [out] IDCardData类型读出的数据,参见5。返回值:成功返回0,错误返回见6。4. 附加类API
      int  Syn_SendSound(int iCmdNo);
    说明: 发送语音  参数:iCmdNo [in] 声音编号返回值:成功返回0,错误返回见6。void Syn_DelPhotoFile();
    说明: 删除临时照片文件  参数:无返回值:成功返回0,错误返回见6。5. 结构体声明
      typedef struct tagIDCardData{
    char Name[32]; //姓名       
    char Sex[4];   //性别
    char Nation[6]; //名族
    char Born[18]; //出生日期
    char Address[72]; //住址
    char IDCardNo[38]; //身份证号
    char GrantDept[32]; //发证机关
    char UserLifeBegin[18]; //有效开始日期
    char UserLifeEnd[18];  //有效截止日期
    char reserved[38]; //保留
    char PhotoFileName[255]; //照片路径
    }IDCardData;6.函数返回值
       0   操作成功或相片解码解码正确
    -1   端口打开失败/端口尚未打开/端口号不合法
    -2   证/卡中此项无内容
    -3   PC接收超时,在规定的时间内未接收到规定长度的数据
    -4   数据传输错误 
    -5   该SAM_V串口不可用,只在SDT_GetCOMBaud时才有可能返回
    -6   接收业务终端数据的校验和错
    -7   接收业务终端数据的长度错
    -8   接收业务终端的命令错误,包括命令中的各种数值或逻辑搭配错误
    -9   越权操作
    -10  无法识别的错误
    -11  寻找证/卡失败
    -12  选取证/卡失败
    -13  调用sdtapi.dll错误
    -14  相片解码错误
    -15  授权文件不存在
    -16  设备连接错误7.注意
      7.1系统支持的串行端口号:1-16,USB端口号:1001-1016  7.2 iIfOpen [in] 整数,0表示不在该函数内部打开和关闭串口,此时确保之前调用了Syn_OpenPort来打开端口,并且在不需要与端口通信时,调用Syn_ClosePort关闭端口;非0表示在API函数内部包含了打开端口和关闭端口函数,之前不需要调用Syn_OpenPort,也不用再调用Syn_ClosePort。  7.3 普通开发中只使用“端口类API”与“身份证卡类API” 与“附加类API”就能满足开发需要,
          使用方法见第10部分实例。
      
      7.4 在使用Syn_SendSound函数时请先用Syn_ClosePort函数关闭打开的端口。
      
      7.5 SDK包包含文件
         Syn_IDCardRead.dll、Syn_IDCardRead.lib、Syn_IDCardRead.h、sdtapi.dll、WltRS.dll8.声音命令暂时未定
    0. 读身份证成功
    9.Syn_IDCardRead.h头文件:
    #ifdef  _WIN32
    #define STDCALL  __stdcall
    #else
    #define STDCALL
    #endif
    #ifndef SDTAPI_
    #define SDTAPI_
    #ifdef __cplusplus
    extern "C"{
    #endif #pragma pack(1)
    typedef struct tagIDCardData{
    char Name[32];
    char Sex[4];
    char Nation[6];
    char Born[18];
    char Address[72];
    char IDCardNo[38];
    char GrantDept[32];
    char UserLifeBegin[18];
    char UserLifeEnd[18];
    char reserved[38];
    char PhotoFileName[255];
    }IDCardData;#pragma pack()/************************端口类API *************************/
    int STDCALL Syn_GetCOMBaud(int iComID,unsigned int *puiBaud);
    int STDCALL Syn_SetCOMBaud(int iComID,unsigned int  uiCurrBaud,unsigned int  uiSetBaud);
    int STDCALL Syn_OpenPort(int iPortID);
    int STDCALL Syn_ClosePort(int iPortID);/************************ SAM类API *************************/
    int STDCALL Syn_GetSAMStatus(int iPortID,int iIfOpen);
    int STDCALL Syn_ResetSAM(int iPortID,int iIfOpen);
    int STDCALL Syn_GetSAMID(int iPortID,unsigned char *pucSAMID,int iIfOpen);
    int STDCALL Syn_GetSAMIDToStr(int iPortID,char *pcSAMID,int iIfOpen);/********************身份证卡类API *************************/
    int STDCALL Syn_StartFindIDCard(int iPortID,unsigned char *pucManaInfo,int iIfOpen);
    int STDCALL Syn_SelectIDCard(int iPortID,unsigned char *pucManaMsg,int iIfOpen);
    int STDCALL Syn_ReadMsg(int iPortID,int iIfOpen,IDCardData *pIDCardData);/********************附加类API *****************************/
    int  STDCALL Syn_SendSound(int iCmdNo);
    void STDCALL Syn_DelPhotoFile();
    #ifdef __cplusplus
    }
    #endif 
    #endif
    }10.调用实例:
    10.1 vc6.0调试通过  
    void CSampleDlg::OnButton1() 
    {
    // TODO: Add your control notification handler code here
    int ifOpen;
        int iPort;
        int iRet;
        unsigned char pucIIN[4];
        unsigned char pucSN[8];
    IDCardData CardMsg;

        ifOpen=0; //是否需要打开串口
        iPort=1;
    iRet=Syn_OpenPort(iPort);
    if (iRet==0)
    {
    iRet=Syn_StartFindIDCard(iPort,pucIIN,ifOpen);
        if (iRet==0)
    {
    iRet=Syn_SelectIDCard(iPort,pucSN,ifOpen);
            if (iRet==0) 
    {
    iRet=Syn_ReadMsg(iPort,0,&CardMsg);
    if (iRet==0)
    {
    //显示读出的信息
    UpdateData(true);
    m_name=CardMsg.Name;
    UpdateData(false);
    Syn_SendSound(0);
    Syn_DelPhotoFile();
    }

    } }
      }
    Syn_ClosePort(iPort);
     
    }
      

  15.   

    提供通用二代身份证WEB终端控件及控件的VB源代码:提供二代身份证WEB终端控件 lkySfzCard.ocx ,用于WEB开发,并提供该控件的VB源代码,有需要者请联系我。
    QQ:150227334
      

  16.   

    提供通用二代身份证WEB终端控件及控件的VB源代码:提供二代身份证WEB终端控件 lkySfzCard.ocx ,用于WEB开发,并提供该控件的VB源代码,有需要者请联系我。
    QQ:150227334