首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 呼叫 DLL 完整教學:使用 JACOB (Java-COM Bridge) 控制 POS 周邊設備

     編輯:Java 相關知識

背景

專案需透過 DLL 控制 POS 週邊(錢箱、小票印表機、顧客顯示器)。Java 無法直接載入 DLL,需透過橋接庫。本文採用 JACOB (Java-COM Bridge) 1.9 版。

環境準備

  1. 下載 JACOB,取得 jacob.jar 與 jacob.dll。
  2. jacob.dll 放入系統路徑(如 C:\Windows\System32)或 -Djava.library.path 指定目錄。
  3. jacob.jar 加入專案 Classpath。

核心程式碼

import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;

public class PosController {
    private ActiveXComponent controller;
    private Dispatch dispatch;

    public PosController() {
        try {
            // ControllerId 為 DLL 註冊的 ProgID
            controller = new ActiveXComponent("POSControler.Controler");
            dispatch = controller.getObject();
        } catch (Exception e) {
            dispatch = new Dispatch(); // 避免 NPE
            System.err.println("載入 DLL 失敗: " + e.getMessage());
        }
    }

    // 無參數方法
    public void setDefaultFont() {
        Dispatch.call(dispatch, "setDefaultFont");
    }

    // 有參數方法:依序傳入
    public void show(String value, int type) {
        Dispatch.call(dispatch, "show", value, type);
    }

    // 取得回傳值
    public String getStatus() {
        Variant v = Dispatch.call(dispatch, "getStatus");
        return v.getString();
    }
}

關鍵 API 說明

  • ActiveXComponent(String progId):連接 COM 元件(DLL 需先 regsvr32 註冊)。
  • getObject():取得 IDispatch 指標,後續透過 Dispatch.call 調用方法。
  • Dispatch.call(dispatch, "methodName", args...):引動方法,支援基本型別、String、Variant 自動封送。
  • Dispatch.get/put:讀寫屬性。

常見坑點與解法

替代方案

若不想依賴 COM,可考慮 JNA (Java Native Access) 直接映射 C 風格 DLL 出口函數,無需註冊 COM 元件,跨平台性更好。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
問題解決方案
UnsatisfiedLinkError: jacob.dll確認 dll 位於 java.library.path,32/64 位元與 JVM 一致。
ClassNotFoundException: ActiveXComponent確認 jacob.jar 已加入 classpath。
DLL 方法無回應/拋 ComFailException檢查 ProgID 是否正確(注冊表 HKEY_CLASSES_ROOT\ProgID\CLSID),DLL 是否正確實作 IDispatch。
中文參數亂碼JACOB 預設使用系統預設編碼;若 DLL 要求 UTF-8,可嘗試 Variant 封裝或 JNA 替代方案。