调用DLL文件
DLL是Dynamic Link Library的缩写,中文名称为动态链接库。在Windows操作系统中,DLL是一种包含代码和数据的文件,可以同时被多个程序使用。通过使用DLL,程序能够实现模块化,从可执行文件中分离出常用函数,从而减少内存消耗和磁盘空间占用。此外,DLL还支持插件功能以及便于更新应用程序的部分功能而不必重新编译整个程序。
在轻语言视窗程序中调用 Windows 下使用C语言编写的 DLL 文件时,通常需要借助 Java Native Interface (JNI) 技术。以下是基本步骤:
-
创建DLL:首先确保您的C语言编写的DLL已经正确编写并编译完成,且包含了你需要调用的函数。
-
生成头文件:使用
javac
命令编译包含native方法声明的Java类,然后使用javah
工具根据这个类生成对应的C语言头文件。这个头文件定义了JNI与本地代码之间的接口。 -
编写桥接代码:基于上一步生成的头文件,在C源文件中实现相应的函数,这些函数会作为Java代码和你的DLL之间的桥梁。在这个阶段,你将调用原始DLL中的函数,并处理必要的数据转换。
-
加载DLL:在Java代码中,使用
System.loadLibrary("yourdllname");
来加载你的DLL。注意这里的"yourdllname"不包括".dll"扩展名。 -
调用本地方法:在Java中声明native方法,并在适当的地方调用它们。这些方法实际上是在DLL中实现的。
需要注意的是,直接操作DLL文件可能会涉及到复杂的细节,如数据类型映射、异常处理等。如果你不是特别熟悉JNI的工作原理,可能需要花费一些时间来学习和调试。此外,为了简化跨语言调用的过程,也可以考虑使用第三方库或工具,例如JNA(Java Native Access),它提供了更简单的方式来调用本地库,而不需要生成额外的胶水代码。
使用 jna-x.jar 调用DLL
jna-x.jar 是 Java Native Access (JNA) 库的一个版本。JNA 是一个开源的Java库,它允许Java代码直接调用本地动态链接库(如Windows上的DLL文件、Linux上的SO文件等)中的函数,而无需编写任何JNI(Java Native Interface)代码或桥接代码。这意味着开发者可以更简单地将Java应用程序与使用C、C++、Assembly等语言编写的本地代码集成起来。
本文使用 jna-5.13.0.jar 为大家讲解如何在轻语言视窗程序中调用DLL中的函数。
1.添加必要文件
将 jna-5.13.0.jar 与需要调用的 DLL 文件放在项目中的 libs 文件夹中。
2.在代码中使用原生代码调用
由于调用DLL对一般用户来说,相对较复杂,需要同时掌握 Java 与 C 语言、因此在使用该功能之前,建议先学习相关基础开发知识。
这里演示在视窗中调用并弹出 Windows 中的 User32 的系统信息框,代码示例:
引用 com.sun.jna.Library
引用 com.sun.jna.Native
引用 com.sun.jna.win32.StdCallLibrary
引用 com.sun.jna.platform.win32.WinDef.HWND
引用 com.sun.jna.ptr.IntByReference
@{
public interface User32 extends StdCallLibrary {
User32 INSTANCE = Native.load("user32", User32.class);
int MessageBoxA(int hWnd, String lpText, String lpCaption, int uType);
boolean SetWindowTextA(HWND hWnd, String lpString);
HWND FindWindowA(String lpClassName, String lpWindowName);
}
}
事件 按钮4.被单击(来源对象 为 对象,事件对象 为 鼠标事件)
User32.INSTANCE.MessageBoxA(0, "欢迎使用 VcnStudio 轻舟视窗开发插件!", "VcnStudio 视窗", 0)
结束 事件
事件 按钮5.被单击(来源对象 为 对象,事件对象 为 鼠标事件)
变量 目标窗口句柄 为 HWND = User32.INSTANCE.FindWindowA(null, "视窗DLL演示")
如果(目标窗口句柄 != 空)
User32.INSTANCE.SetWindowTextA(目标窗口句柄, "窗口标题被修改(通过DLL)")
否则
信息框("未找到窗口句柄")
结束 如果
结束 事件
编译运行效果
例程与库参考
VcnStudio 安装包内视窗程序,已自带:调用DLL演示例程 详细方法可参考该例程。
同时位于 VcnStudio 安装目录/samples/component.library
该文件夹中内置官方开源的类库封装参考例程,其中包含 测试DLL库 的库源码,该例程演示了如何将调用 DLL 封装成一个类库使用。
其它说明
在轻语言视窗中调用 Dll 文件,流程相对较复杂,建议一般将其封装成类库独立使用。