精华内容
下载资源
问答
  • 2015-09-10 11:49:00

    考勤机是m880,需要在考勤机中设置保存考勤时照片。

    SDK的开发文档中只有下载考勤记录的函数

    ReadGeneralLogData

    SSR_GetGeneralLogData

    两者配合能读取到打卡记录。

    文档中没有下载考勤照片的函数,在代码提示中查看photo。发现以下三个函数

    public virtual bool GetPhotoNamesByTime(int dwMachineNumber, int iFlag, string sTime, string eTime, out string AllPhotoName);

    public virtual bool GetPhotoCount(int dwMachineNumber, out int count, int iFlag);

    public virtual bool GetPhotoByName(int dwMachineNumber, string PhotoName, out byte PhotoData, out int PhotoLength);

    根据名字可以猜到功能。

    GetPhotoNamesByTime读取考勤机中的照片名列表,照片名命名规则是时间+考勤号,多个名字用'\t'分隔。

    GetPhotoByName根据名字下载照片。

    但是在代码中如下调用时,失败,返回错误码-2

    byte photoData;
    int photolength = 0;
    //照片名需要加上“.jpg”
    axCZKEM1.GetPhotoByName(iMachineNumber,"20150910063045" + ".jpg", out  photoData, out photolength)

    找中控的售后,没人理。只能靠自己了。

    用Wireshark分析电脑和考勤机的通讯,发现考勤机已经正确返回了照片的数据,照片数据是二进制数据。

    GetPhotoByName函数的参数是out photoData,这个应该保存照片数据。

    问题在于photoData是byte类型的,照片的二进制数据应该是byte[]类型。调用函数造成了向内存中非法写入数据。

    想了个非常规的解决方法

    unsafe
    {
      byte[] photoData = new byte[1024 * 10];
      int photolength = 0;
      try
      {
        if (axCZKEM1.GetPhotoByName(iMachineNumber, arr[j].Trim() + ".jpg", out photoData[0], out photolength))
        {
          if (photolength < photoData.Length)
          {
            byte[] tmp = new byte[photolength];
            Array.Copy(photoData, tmp, photolength);
            System.IO.File.WriteAllBytes( "d:\\photos\\20150910063045.jpg", tmp);
           }
             }
           }
         catch (Exception ex) { }
     }

    最后在项目的属性里设置:允许不安全代码。

     

    转载于:https://www.cnblogs.com/darksied/p/4797392.html

    更多相关内容
  • 中控考勤机开发文件/文档 获取考勤数据的例子(C#) 中控考勤机开发文件/文档
  • C#中控考勤机对接,案例简单,数据库表都有,新手很容易看懂
  • 我要下载考勤机软件

    2014-09-18 10:22:25
    我要下载考勤机软件,这上传的是考勤机软件说明。
  • 用C#代码获取中控考勤机上的数据,步骤如下: 先注册中控sdk,然后连接考勤机(我用的是中控s60考勤机)要保证先能通讯,打开代码输入IP地址即可获取考勤数据
  • 根据中控C#demo ,获取s60考勤考勤数据
  • (晨光)MGTime6.0考勤管理系统用户手册V1.0-201610
  • 这是一套彩色考勤表excel模版下载,喜欢的人都来下载吧。该文档为彩色考勤表excel模版下载,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 对于一个集体考勤管理制度下载是很有作用的,小编为大家带来了最新的考勤管理制度下载,能够提高...该文档为考勤管理制度免费下载,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 这是一套简约考勤表excel模版下载,喜欢的人都来下载吧。该文档为简约考勤表excel模版下载,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 这是一套每周考勤记录excel模版下载,喜欢的人都来下载吧。该文档为每周考勤记录excel模版下载,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 这是一套多面考勤表excel模版下载,喜欢的人都来下载吧。该文档为多面考勤表excel模版下载,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 这是一套工厂常用考勤表excel模版下载,喜欢的人都来下载吧。该文档为工厂常用考勤表excel模版下载,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 中控H10指纹考勤机的USB驱动程序+考勤管理系统标准版driver文件夹里面是驱动,需要先安装驱动再安装管理软件。支持其他型号考勤机,兼容其他版本。其实这也是一个考勤机的通用版驱动。...,欢迎下载体验
  • 精典源码delphi源码下载 针织厂人事考勤系统.zip 精典源码delphi源码下载 针织厂人事考勤系统.zip 精典源码delphi源码下载 针织厂人事考勤系统.zip 精典源码delphi源码下载 针织厂人事考勤系统.zip 精典源码delphi...
  • 支持多点、单点考勤,与中控指纹、面部考勤机实时自动同步、支持定时数据上传、下载。 智能排班倒班加班。 智能换算(公出、各类假、加班、旷工、迟到、早退、忘签、退签等)。 清晰、明了的二十余类考勤统计报表。...
  • 中控考勤机二次开发SDK包 64位 中控智慧 考勤
  • 这是一套学生上课考勤表excel模版下载,喜欢的人都来下载吧。该文档为学生上课考勤表excel模版下载,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 这是一套班级考勤统计表excel模版下载,喜欢的人都来下载吧。该文档为班级考勤统计表excel模版下载,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 考勤制度下载

    2020-12-30 01:30:36
    通过统计资料和实时信息分析,小编为大家推荐了这一款考勤制度下载,只为给你最全面、最详细的考勤制度下...该文档为考勤制度下载,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 诚展软件开发的中控刷卡考勤机自动下载程序,需要用到中控的脱机控件调用,里面的数据库连接可以更换掉。已在项目中稳定运行
  • 这一款整理收录发布的员工考勤记录表模板下载,可用于学习、参考、借鉴员工考勤记录表模板下载...该文档为员工考勤记录表模板下载,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • ZKTeco考勤管理系统(zkteco考勤软件下载)V4.8.8 中文版
  • 这是一套职工考勤表excel模版下载,喜欢的人都来下载吧。该文档为职工考勤表excel模版下载,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 得力考勤机3969驱动是一...为防止因驱动损坏的原因导致,考勤机无法使用,在此贴出得力考勤机3969驱动的下载地址,以便用户们进行下载!驱动安装方法:1、下载完毕后,点击驱动文件夹中的安装程序。2、本,欢迎下载体验
  • python应用钉钉考勤应用的一个demo供大家参考,如果有那个大神补充可以写在留言去大家一起分享。希望对刚刚入门的朋友有所帮助。
  • * * @return 返回的map中,包含以下键值: * "EnrollNumber" 人员编号 * "Time" 考勤时间串,格式: yyyy-MM-dd HH:mm:ss * "VerifyMode" * "InOutMode" * "Year" 考勤时间:年 * "Month" 考勤时间:月 * "Day" 考勤...

    package com.XXX.gasstation.commons.utils;

    import com.jacob.activeX.ActiveXComponent;

    import com.jacob.com.Dispatch;

    import com.jacob.com.Variant;

    import com.XXX.gasstation.commons.utils.lang.DateUtils;

    import net.sf.json.JSONObject;

    import java.util.*;

    /**

    * @ClassName:${type_name}

    * @Description:${todo}(连接、获取考勤机数据)

    * @author: ZHOUPAN

    * @date ${date} ${time}

    * @Copyright: 2018 www.zsplat.com Inc. All rights reserved.

    * ${tags}

    */

    public class ZkemSDKUtils {

    //zkemkeeper.ZKEM.1 为zkemkeeper.dll 注册成功后 在注册表可以查看:HKEY_CLASSES_ROOT最下面

    private static ActiveXComponent zkem = new ActiveXComponent("zkemkeeper.ZKEM.1");

    /**

    * 连接考勤机

    *

    * @param address 考勤机地址

    * @param port 端口号

    * @return

    */

    public static boolean connect(String address, int port) {

    boolean result = zkem.invoke("Connect_NET", address, port).getBoolean();

    return result;

    }

    /**

    * 读取考勤记录到pc缓存。配合getGeneralLogData使用

    *

    * @return

    */

    public static boolean readGeneralLogData() {

    boolean result = zkem.invoke("ReadGeneralLogData", 1).getBoolean();

    return result;

    }

    /**

    * 读取该时间之后的最新考勤数据。 配合getGeneralLogData使用。//网上说有这个方法,但是我用的开发文档没有这个方法,也调用不到,我在controller中处理获取当天数据

    *

    * @param lastest

    * @return

    */

    public static boolean readLastestLogData(Date lastest) {

    boolean result = zkem.invoke("ReadLastestLogData", 2018 - 07 - 24).getBoolean();

    return result;

    }

    /**

    * 获取缓存中的考勤数据。配合readGeneralLogData / readLastestLogData使用。

    *

    * @return 返回的map中,包含以下键值:

    * "EnrollNumber" 人员编号

    * "Time" 考勤时间串,格式: yyyy-MM-dd HH:mm:ss

    * "VerifyMode"

    * "InOutMode"

    * "Year" 考勤时间:年

    * "Month" 考勤时间:月

    * "Day" 考勤时间:日

    * "Hour" 考勤时间:时

    * "Minute" 考勤时间:分

    * "Second" 考勤时间:秒

    */

    public static List> getGeneralLogData() {

    Variant dwMachineNumber = new Variant(1, true);//机器号

    Variant dwEnrollNumber = new Variant("", true);

    Variant dwVerifyMode = new Variant(0, true);

    Variant dwInOutMode = new Variant(0, true);

    Variant dwYear = new Variant(0, true);

    Variant dwMonth = new Variant(0, true);

    Variant dwDay = new Variant(0, true);

    Variant dwHour = new Variant(0, true);

    Variant dwMinute = new Variant(0, true);

    Variant dwSecond = new Variant(0, true);

    Variant dwWorkCode = new Variant(0, true);

    List> strList = new ArrayList>();

    boolean newresult = false;

    do {

    Variant vResult = Dispatch.call(zkem, "SSR_GetGeneralLogData", dwMachineNumber, dwEnrollNumber, dwVerifyMode, dwInOutMode, dwYear, dwMonth, dwDay, dwHour, dwMinute, dwSecond, dwWorkCode);

    newresult = vResult.getBoolean();

    if (newresult) {

    String enrollNumber = dwEnrollNumber.getStringRef();

    //如果没有编号,则跳过。

    if (enrollNumber == null || enrollNumber.trim().length() == 0)

    continue;

    String month = dwMonth.getIntRef() + "";

    String day = dwDay.getIntRef() + "";

    if (dwMonth.getIntRef()<10) {

    month= "0"+ dwMonth.getIntRef();

    }

    if (dwDay.getIntRef() < 10) {

    day= "0"+ dwDay.getIntRef();

    }

    String validDate= dwYear.getIntRef()+ "-" + month + "-" + day;

    String currentDate= DateUtils.getCurrentTime("yyyy-MM-dd");if (currentDate.equals(validDate)) {

    Map m = new HashMap();

    //Mapuser = getUserInfoByNumber(enrollNumber);

    m.put("EnrollNumber", enrollNumber);

    m.put("Time", dwYear.getIntRef() + "-" + dwMonth.getIntRef() + "-" + dwDay.getIntRef() + " " + dwHour.getIntRef() + ":" + dwMinute.getIntRef() + ":" + dwSecond.getIntRef());

    m.put("VerifyMode", dwVerifyMode.getIntRef());

    m.put("InOutMode", dwInOutMode.getIntRef());

    m.put("Year", dwYear.getIntRef());

    m.put("Month", dwMonth.getIntRef());

    m.put("Day", dwDay.getIntRef());

    m.put("Hour", dwHour.getIntRef());

    m.put("Minute", dwMinute.getIntRef());

    m.put("Second", dwSecond.getIntRef());

    strList.add(m);

    }

    }

    } while (newresult == true);

    return strList;

    }

    /**

    * 获取用户信息

    *

    * @return 返回的Map中,包含以下键值:

    * "EnrollNumber" 人员编号

    * "Name" 人员姓名

    * "Password" 人员密码

    * "Privilege"

    * "Enabled" 是否启用

    */

    public static List> getUserInfo() {

    List> resultList = new ArrayList>();

    //将用户数据读入缓存中。

    boolean result = zkem.invoke("ReadAllUserID", 1).getBoolean();

    Variant v0 = new Variant(1);

    Variant sdwEnrollNumber = new Variant("", true);

    Variant sName = new Variant("", true);

    Variant sPassword = new Variant("", true);

    Variant iPrivilege = new Variant(0, true);

    Variant bEnabled = new Variant(false, true);

    while (result) {

    //从缓存中读取一条条的用户数据

    result = zkem.invoke("SSR_GetAllUserInfo", v0, sdwEnrollNumber, sName, sPassword, iPrivilege, bEnabled).getBoolean();

    //如果没有编号,跳过。

    String enrollNumber = sdwEnrollNumber.getStringRef();

    if (enrollNumber == null || enrollNumber.trim().length() == 0)

    continue;

    //由于名字后面会产生乱码,所以这里采用了截取字符串的办法把后面的乱码去掉了,以后有待考察更好的办法。

    //只支持2位、3位、4位长度的中文名字。

    String name = sName.getStringRef();

    if (sName.getStringRef().length() > 4) {

    name = sName.getStringRef().substring(0, 4);

    }

    //如果没有名字,跳过。

    if (name.trim().length() == 0)

    continue;

    Map m = new HashMap();

    m.put("EnrollNumber", enrollNumber);

    m.put("Name", name);

    m.put("Password", sPassword.getStringRef());

    m.put("Privilege", iPrivilege.getIntRef());

    m.put("Enabled", bEnabled.getBooleanRef());

    resultList.add(m);

    }

    return resultList;

    }

    /**

    * 设置用户信息

    *

    * @param number

    * @param name

    * @param password

    * @param isPrivilege

    * @param enabled

    * @return

    */

    public static boolean setUserInfo(String number, String name, String password, int isPrivilege, boolean enabled) {

    Variant v0 = new Variant(1);

    Variant sdwEnrollNumber = new Variant(number, true);

    Variant sName = new Variant(name, true);

    Variant sPassword = new Variant(password, true);

    Variant iPrivilege = new Variant(isPrivilege, true);

    Variant bEnabled = new Variant(enabled, true);

    boolean result = zkem.invoke("SSR_SetUserInfo", v0, sdwEnrollNumber, sName, sPassword, iPrivilege, bEnabled).getBoolean();

    return result;

    }

    /**

    * 获取用户信息

    *

    * @param number 考勤号码

    * @return

    */

    public static MapgetUserInfoByNumber(String number) {

    Variant v0 = new Variant(1);

    Variant sdwEnrollNumber = new Variant(number, true);

    Variant sName = new Variant("", true);

    Variant sPassword = new Variant("", true);

    Variant iPrivilege = new Variant(0, true);

    Variant bEnabled = new Variant(false, true);

    boolean result = zkem.invoke("SSR_GetUserInfo", v0, sdwEnrollNumber, sName, sPassword, iPrivilege, bEnabled).getBoolean();

    if (result) {

    Map m = new HashMap();

    m.put("EnrollNumber", number);

    m.put("Name", sName.getStringRef());

    m.put("Password", sPassword.getStringRef());

    m.put("Privilege", iPrivilege.getIntRef());

    m.put("Enabled", bEnabled.getBooleanRef());

    return m;

    }

    return null;

    }

    public static void main(String[] args) {

    ZkemSDKUtils sdk = new ZkemSDKUtils();

    Map map = new HashMap();

    boolean connFlag = sdk.connect("192.168.1.201", 4370);

    if (connFlag) {

    boolean flag = sdk.readGeneralLogData();

    List> strList = sdk.getGeneralLogData();

    map.put("strList", strList);

    System.out.println("flag" + flag);

    System.out.println(JSONObject.fromObject(map).toString());

    }

    }

    }

    2. Controller层

    展开全文
  • EXCEL_VBA制作员工考勤系统源码 适用环境:EXCEL2003/2007/2010 大家下载下来,可以设置断点调适运行代码,学习VBA的编程。 也可以直接使用,这个是员工考勤系统。
  • 这是一套个人考勤表excel模版下载,喜欢的人都来下载吧。该文档为个人考勤表excel模版下载,是一份很不错的参考资料,具有较高参考价值,感兴趣的可以下载看看
  • 适用场景:门禁场景的应用,适合安装在Android系统的门口机、闸机头、Pad等设备上。...主要功能:人员注册、人脸识别开门、考勤打卡、门禁权限管理、识别记录查询等。 激活有问题or需要源码,请加微信Hongzhushou2

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,656
精华内容 2,262
关键字:

下载考勤