相信大家对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的查找方式
注册表查找
步骤如下:
- 打开注册表编辑器:
按下Win + R
→ 输入regedit
→ 回车 - 定位路径:
HKEY_CLASSES_ROOT\CLSID
- 在
CLSID
下逐个查看子项,找到你使用的 DLL 文件路径。
- 查看每个 CLSID 下的
InprocServer32
子键 - 检查
默认值
是否包含你的 DLL 路径,例如:
C:\Windows\System32\yourdll.dll
- 如果找到了对应的 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程序是运行在服务器的。)
如果这篇文章对您有帮助,帮个小忙一键三连支持支持!!!欢迎关注我获取下一篇内容,如果您有任何问题欢迎给我留言,尽我所能给您解答。