java 使用jacob 调用中控考勤机dll(详细配置)
2017-02-13 16:11
316 查看
根据网上内容搜索以及不断尝试,总结出以下java使用jacob调用中控考勤机sdk方法
1、jacob-1.18版本
2、jdk1.732位(经过测试jacob目前只支持32位jdk,64位下报错);3、将jacob.jar 放入项目 WEB-INFO/lib下导入:
4、将jacob-1.18-x64.dll 放入32位 jdk/bin目录下,我的是:C:\Program Files (x86)\Java\jdk1.7.0_79\bin;
5、将中控考勤机sdk 的dll文件全部放入 c:\windows\syswow64 目录下(我的是64位系统,32位的话没测试,放入system32目录下);
6、运行cmd 注册zkemkeeper.dll --->regsvr32 c:\windows\syswow64\zkemkeeper.dll
7、成功后如下提示:
8、已经配置完毕,进行代码测试:
//zkemkeeper.ZKEM.1 为zkemkeeper.dll 注册成功后 在注册表可以查看:HKEY_CLASSES_ROOT最下面
import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; /** * 中控考勤机sdk函数调用类 * @author wangchao * */ public class ZkemSDK { private static ActiveXComponent zkem = new ActiveXComponent("zkemkeeper.ZKEM.1"); /** * 链接考勤机 * @param address 考勤机地址 * @param port 端口号 * @return */ public boolean connect(String address,int port){ boolean result = zkem.invoke("Connect_NET",address,port).getBoolean(); return result; } /** * 断开考勤机链接 */ public void disConnect(){ zkem.invoke("Disconnect"); } }
/** * 考勤机链接测试 * @author wangchao * */ public class Main { public static void main(String[] args) { ZkemSDK sdk = new ZkemSDK(); boolean connFlag = sdk.connect("192.168.1.100", 4370); System.out.println("conn:"+connFlag); } }
9、输出结果为true ,考勤机链接成功
A、需要注意的是 jacob 我测试只能在32位jdk下使用;
B、如果main测试报错,可以先把 考勤软件安装打开 通过网络连接上考勤机之后再进行测试;
============================================= 转载提供获取考勤信息和人员信息方法 =============================================
package com.tgb.zkem; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; /** * 中控考勤机sdk函数调用类 * @author wangchao * */ public class ZkemSDK { private static ActiveXComponent zkem = new ActiveXComponent("zkemkeeper.ZKEM.1"); /** * 读取考勤记录到pc缓存。配合getGeneralLogData使用 * @return */ public boolean readGeneralLogData(){ boolean result = zkem.invoke("ReadGeneralLogData",100).getBoolean(); return result; } /** * 获取缓存中的考勤数据。配合readGeneralLogData / readLastestLogData使用。 * @return 返回的map中,包含以下键值: "EnrollNumber" 人员编号 "Time" 考勤时间串,格式: yyyy-MM-dd HH:mm:ss "VerifyMode" "InOutMode" "Year" 考勤时间:年 "Month" 考勤时间:月 "Day" 考勤时间:日 "Hour" 考勤时间:时 "Minute" 考勤时间:分 "Second" 考勤时间:秒 */ public List<Map<String,Object>> getGeneralLogData(){ Variant v0 = new Variant(1); 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<Map<String,Object>> strList = new ArrayList<Map<String,Object>>(); boolean newresult = false; do{ Variant vResult = Dispatch.call(zkem, "SSR_GetGeneralLogData", v0,dwEnrollNumber,dwVerifyMode,dwInOutMode,dwYear,dwMonth,dwDay,dwHour, dwMinute,dwSecond,dwWorkCode); newresult = vResult.getBoolean(); if(newresult) { String enrollNumber = dwEnrollNumber.getStringRef(); // 4000 如果没有编号,则跳过。 if(enrollNumber == null || enrollNumber.trim().length() == 0) continue; Map<String,Object> m = new HashMap<String, Object>(); 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 List<Map<String,Object>> getUserInfo(){ List<Map<String,Object>> resultList = new ArrayList<Map<String,Object>>(); //将用户数据读入缓存中。 boolean result = zkem.invoke("ReadAllUserID",100).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 = ""; if(sName.getStringRef().getBytes().length == 9 || sName.getStringRef().getBytes().length == 8) { name = sName.getStringRef().substring(0,3); }else if(sName.getStringRef().getBytes().length == 7 || sName.getStringRef().getBytes().length == 6) { name = sName.getStringRef().substring(0,2); }else if(sName.getStringRef().getBytes().length == 11 || sName.getStringRef().getBytes().length == 10) { name = sName.getStringRef().substring(0,4); } //如果没有名字,跳过。 if(name.trim().length() == 0) continue; Map<String,Object> m = new HashMap<String, Object>(); 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 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 Map<String,Object> getUserInfoByNumber(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<String,Object> m = new HashMap<String, Object>(); 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; } }
相关文章推荐
- Java使用JNI调用VC的DLL的一个小例子
- 使用JNI技术实现JAVA程序调用dll
- 使用JNI技术实现JAVA程序调用dll
- java调用com组件操作word使用总结(jacob)
- Chap5:使用JNI技术实现java程序调用第三方dll(c/c++)文件的功能
- 整理MINGW编译dll使用JNI被java调用的几种方式
- java调用dll进行人脸识别(JNI的使用)
- 使用JNI技术实现JAVA程序调用dll
- [转]Java调用DLL动态链接库的方案:JNI, Jawin, Jacob.
- Java调用dll详细例子
- java调用c++写的dll 出现由于应该程序配置不正确,应用程序未能启动
- 使用JNI技术实现JAVA程序调用dll
- 使用 SWIG 实现 Java 调用 C++ DLL
- java 用jacob 调用vb写的dll
- win32下使用gcc编译供java 调用的dll须知(jni) http://www.blogjava.net/lixf/archive/2005/12/23/25177.html
- Dll中调用WebService,如何使用Web.config中配置的WebService的Url
- java反射调用配置文件构造类对象,使用其方法
- java 用jacob 调用vb写的dll
- Java使用JNI调用C/C++的DLL动态链接库1
- Java调用dll例子,JNative的使用