如何使用java调用DLL控件

相信大家对java都有一个刻板的映像:web开发的扛把子、Android应用的主流。但其实java还可作为桌面应用开发,虽然它不像C++有QT,C#有WPF那样美观的框架,但当公司没有这两种开发语言的工程师的时候,作为java工程师的你也能勉强抗一抗。

我们公司最近有一个需求,关联方提供了一个后缀为dll(xxx.dll)的东西给我们调用,作为调了n年http请求的web开发工程师来说,这个需求拿到手里真的像一颗烫手的山芋。

只不过山芋归山芋,需求还是要开发。

既然要调用dll后缀,首先还是得了解一下DLL是什么

DLL控件

DLL控件 是一种在 Windows 系统中使用的 动态链接库(Dynamic Link Library),它通常封装了某些可重用的功能、界面组件或业务逻辑,供其他应用程序调用和使用。

什么是 DLL?

  • 全称:Dynamic Link Library(动态链接库)
  • 文件扩展名:.dll
  • 作用
    • 包含可被多个程序共享的函数、类、资源等
    • 实现模块化开发,提升代码复用性
    • 减少内存占用和程序体积

什么是“DLL 控件”?

“DLL 控件”这个说法一般指以下两种情况之一:

1. ActiveX 控件 / COM 组件
  • 定义:基于 COM(Component Object Model)技术构建的可视化控件,通常以 .dll 或 .ocx 形式存在。
  • 用途
    • 在 VB6、MFC、Delphi 等传统开发环境中使用
    • 嵌入到网页中(IE 浏览器支持 ActiveX 插件)
  • 示例
    • mscomctl.ocx:提供进度条、列表框等常用 UI 控件
    • MSCOMM32.OCX:串口通信控件

注册方法(管理员权限下运行):

regsvr32.exe yourcontrol.dll
2. 用户自定义控件(User Control)
  • 定义:开发者自己编写的控件,打包成.dll 文件,供其他项目引用。

  • 常见于

    • .NET WinForms / WPF 应用程序
    • 封装特定功能的 UI 控件(如自定义按钮、数据展示面板)
  • 优点

    • 可跨项目复用
    • 易于维护和更新

使用jacod调用dll控件

我们使用jacod来调用dll控件,我已经完成了功能并走通了流程,大家可以放心使用该方案不怕坑。

1、准备工作

  • 1 下载jacob.jar、jacob-1.20-x86.dll、jacob-1.20-x86.dll这三个文件。(大家可以关注我公号【星coder】,发送“jacob”拿到下载链接获取jar包和dll文件)
  • 2 将jacob-1.20-x86.dll拷贝到C:\Windows\System32\目录下。
  • 3 将jacob.jar放在你的项目中,并将这个jar变成你的java依赖。

你的java项目需要本地启动(一般是GUI项目,这样你才能调起本地控件)

2、编写程序调用dll控件

要调用dll控件,首先你需要知道dll控件的ProgID,比如长这样dll.prog_id;其次需要知道dll控件的“方法名”和“参数”(这个需要文档)。

dll控件的ProgID的查找方式

注册表查找
步骤如下:

  1. 打开注册表编辑器:
    按下 Win + R → 输入 regedit → 回车
  2. 定位路径:

HKEY_CLASSES_ROOT\CLSID

  1. CLSID 下逐个查看子项,找到你使用的 DLL 文件路径。
  • 查看每个 CLSID 下的 InprocServer32 子键
  • 检查 默认值 是否包含你的 DLL 路径,例如:
 C:\Windows\System32\yourdll.dll
  1. 如果找到了对应的 CLSID,回到:
HKEY_CLASSES_ROOT

这里会列出所有已注册的 ProgID,你可以搜索该 CLSID 对应的 ProgID。

下面就可以开始编程了:

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

public class JacobDllTest {
    public static void main(String[] args) {
        try {
            // Step 1: 创建 COM 对象(替换为你的 ProgID)
            ActiveXComponent component = new ActiveXComponent("yinhai.yh_hb_sctr");

            // Step 2: 准备参数(根据实际接口修改)
            // 参数 业务编号
            String businessId = "1101"; 
            // 参数 JSON 字符串
            String paramJson = "{\"opter\":\"Y123456\"}";
             // 接收返回值的 Variant,true代表创建一个可修改的 Variant 对象,dll可以修改这个对象,意味着可以用其接收dll的返回值。
            Variant result = new Variant("", true);          

            // Step 3: 调用方法(替换为你要调用的函数名,如 yh_hb_call)
            Dispatch.call(component, "yh_hb_call", businessId, paramJson, result);

            // Step 4: 获取返回结果
            System.out.println("调用成功,返回值: " + result.getString());

        } catch (Exception e) {
            System.err.println("调用失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

然后编译运行,若编译运行出错,报错没有找到jcob.jar,需要设置jvm参数:

# 值替换为你的jar包路径
-Djava.library.path=D:\seanProject\deepSeekChart\src\main\resources\lib

运行成功后,会打印出调用成功,返回值。

恭喜你,你已经成功调用了dll控件。

但是这只是在main方法中调起了本地dll控件。假如有这样一个问题,我的项目是web项目,页面中需要读取医保卡信息,但是本地医院的医保卡信息不提供接口,需要调取本地dll控件,那么本地dll控件如何与web端进行交互呢?这节我们讲了如何通过java调用本地dll控件,下节我们提供一个方案讲web端如何与本地dll控件进行交互(注意我们这里运行的java程序是本地的,而我们的web程序是运行在服务器的。)

如果这篇文章对您有帮助,帮个小忙一键三连支持支持!!!欢迎关注我获取下一篇内容,如果您有任何问题欢迎给我留言,尽我所能给您解答。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值