1. 程式人生 > >java 使用jacob 呼叫中控考勤機dll(詳細配置)

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是兩個概