java 使用jacob 呼叫中控考勤機dll(詳細配置)
根據網上內容搜尋以及不斷嘗試,總結出以下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();
//如果沒有編號,則跳過。
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 使用jacob 呼叫中控考勤機dll(詳細配置)
根據網上內容搜尋以及不斷嘗試,總結出以下java使用jacob呼叫中控考勤機sdk方法 1、jacob-1.18版本 2、jdk1.732位(經過測試jacob目前只支援32位jdk,64位下報錯); 3、將jacob.jar 放入專案 WEB-INFO/lib下匯入: 4
Java集合框架中的快速失敗(fail—fast)機制詳解
block rac sms 編程 參數 failsafe next ID ted 先說結論:在用for遍歷一個集合對象時,如果遍歷過程中對集合對象的內容進行了修改(增加、刪除),則會拋出ConcurrentModificationException。在單線程下用叠代器遍歷
MFC APP中使用MFC DLL(用C++)
先寫DLL檔案: 選擇MFC擴充套件DLL。 在.def檔案中加入: ; mfcDBstore_1.def : Declares the module parameters for the DLL. LIBRARY "m
Java Swing學習中的小細節(個人筆記)
首先說一下,本文主要記錄個人在學習Java Swing中遇到的問題,由於之前接觸過swing,所以不會講的很詳細。 如果學習和了解Java Swing,建議直接看視訊,下面的講的還是挺不錯的 ①BorderLayout如何修改各個區域大小? 答案:使用
Java非遞歸的方式獲取目錄中所有文件(包括目錄)
class cto div 所有 new dir rem efi log 零、思路解析 對於給出的文件查看其下面的所有目錄,將這個目錄下的所有目錄放入待遍歷的目錄集合中,每次取出該集合中的目錄遍歷,如果是目錄再次放入該目錄中進行遍歷。 一、代碼 /**
中控考勤機的二次開發之數據秒上傳至服務器功能
程序 做到 監控 選擇 環境 客戶 出現 員工 參考 1.客戶選擇了中控考勤機:IFACE系列 2.客戶需要在WEB端實時看到員工的考勤情況 3.需要做到客戶員工數據及時傳遞到服務器 實現方法如下: 1.安裝中控DLL(一定要註意操作系統是32位還是64位,折騰死人
中控考勤機的二次開發之靈活調配職工功能
客戶 考勤 靈活 二次 容量 代碼 功能 參考 以及 客戶新增需求 1.客戶員工需要不定時的外派或支援 2.客戶員工發適時的到分公司去打卡 3.客戶員工的打卡數據需要及時的發放到目標分公司 4.實現功能如下: 1)各分公司需要及時從考勤機上取得員工的打卡驗證數據
java Integer中的方法解析(位操作)
方法 描述 static int bitCount(int i) 返回i的二進位制中1的個數. static int compare(int x, int y)
java開發中的重中之重-------mysql(基礎篇)
介紹: mysql是目前世界上最流行的關係型資料庫,在國內大的網際網路公司都在使用mysql資料庫,mysql經常被我們這樣概述,“mysql是輕量級關係型資料庫”,其實輕量級並不是說mysql是中小型資料庫,在專案開發中,儲存資料的量往往是一個架構問題,如果配合架構,mysql也是可以儲存海
Java集合中的fail-fast(快速失敗)機制
fail-fast機制 fail-fast機制,即快速失敗機制,是Java集合(Collection)中的錯誤檢測機制。當在迭代集合的過程中該集合在結構上發生改變的時候,就有可能會發生fail-fast,即丟擲ConcurrentModificationException異常。fail-fast機制並不保證
Java中不定項引數(可變引數)的作用和使用方式
引言: 我們在編寫方法的過程中,可能會遇見一個方法有不確定引數個數的情況。一般我們會用方法過載來解決問題: //方法過載,解決引數個數不確定問題 public void method(); public void method(int i); public void method(int
2018.10.11在Java程式碼中控制UI介面(桌面檯球)
MainActivity : package com.example.mcq; import android.app.AlertDialog; import android.content.DialogInterface; import android.graphics.Color; impo
java中排序原始碼分析(JDK1.8)
List排序 在開發過程中常用的是jdk自帶的排序 Collections.sort(List<T> list, Comparator<? super T> c); 開啟原始碼如下: @SuppressWarnings({"unchecked",
Java中的Object類 (上篇)
要麼讀書,要麼旅行,身體和心靈總有一個要在路上。——羅馬假日 咱今天學習的是Java的Object類,首先先看程式碼,類裡面有哪些方法。 咱今天學習兩個方法,分別是hashCode,equals。 Obje
C# DLL(程式集)的生成和呼叫
日期:2018年11月24日 環境:Window 10,VS2015 一、利用VS2015自帶的工具生成DLL 步驟: 1.利用C#準備一個.cs檔案; 1 using System; 2 3 public class MyMath 4 { 5 public MyM
Eclipse中啟動Tomcat時(MAVEN專案),報錯:Could not publish to the server. java.lang.IndexOutOfBoundsException的解決過程
Eclipse中啟動Tomcat時(MAVEN專案),報錯:Could not publish to the server. java.lang.IndexOutOfBoundsException,tomcat啟動失敗, 原因:該MAVEN專案下載的本地jar包存在下載失敗的情況 &nbs
QT呼叫VS生成的DLL(無標頭檔案)
目錄 一、準備知識 1.1QT呼叫DLL的兩種常見方法簡介 呼叫說明:關於QT呼叫DLL方法主要分兩種,一種是顯示呼叫,另一種是隱式呼叫。 宣告: 事先我已經自己動手寫了一個簡單的dll檔案(myDLL.dll),C版介面的。首
ProjectLombok外掛----減少 Java 應用程式中樣板程式碼量(get、set.....)
Lombok是一個外掛,用於自動生成java程式碼,減少 Java 應用程式中樣板程式碼量 Lombok外掛的安裝(必須安裝,如果不安裝Eclipse等工具無法解析Lombok註解) 安裝方法: 1、雙擊下載下來的J
java-hadoop程式設計中缺少hadoop.dll和winutils.exe以及產生的classCannotFound異常
一: 現確定自己的windows上有沒有解壓過hadoop的資料夾,環境變數HADOOP_HOME=C:hadoop(hadoop的解壓目錄)是否配置了, path是否引用了%HADOOP_HOME%bin;%HADOOP_HOME%sbin 如果不行
Jacob呼叫VB編寫的DLL
專案上有呼叫Visual Basic 6.0編寫的DLL檔案的需求,在使用JNA呼叫無果後,在網上找了部分資料,整理如下。 為什麼用JNA無法呼叫? VB生成的COM元件,雖然是dll字尾,但事實上,它應該叫做activex dll,是一種com元件,與標準dll是兩個概