專案需透過 DLL 控制 POS 週邊(錢箱、小票印表機、顧客顯示器)。Java 無法直接載入 DLL,需透過橋接庫。本文採用 JACOB (Java-COM Bridge) 1.9 版。
jacob.jar 與 jacob.dll。jacob.dll 放入系統路徑(如 C:\Windows\System32)或 -Djava.library.path 指定目錄。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();
}
}
ActiveXComponent(String progId):連接 COM 元件(DLL 需先 regsvr32 註冊)。getObject():取得 IDispatch 指標,後續透過 Dispatch.call 調用方法。Dispatch.call(dispatch, "methodName", args...):引動方法,支援基本型別、String、Variant 自動封送。Dispatch.get/put:讀寫屬性。| 問題 | 解決方案 |
|---|---|
| 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 替代方案。 |