大漠插件是一款出色的脚本制作插件,几乎所有的游戏脚本开发者都知道这款插件,足以说明它的影响力。官网写道:大漠综合插件 (dm.dll)采用vc6.0编写,识别速度超级快!采用COM接口编写,适用于所有语言调用。但是据我所了解,超过半数以上的大漠插件使用按键精灵或者易语言进行开发,使用Java作为开发语言使用大漠插件的寥寥无几。Java作为优秀的编程语言,自然拥有众多开发者,百度关键字“Java调用大漠插件”,搜索结果几乎全是提问如何使用Java调用的,最近刚好需要,所以研究了一下具体如何实现。
大漠插件 (dm.dll)采用COM接口编写,所以问题也就变成了Java如何调用COM组件,JACOB - Java COM Bridge是一个Java中专门调用COM组件的工具,我们就使用它来实现需求。下载完毕解压之后目录结构如下:
注意,由于dm.dll是32位平台编译,所以在这里我们需要使用jacob-1.19.jar和32位版本的jacob-1.19-x86.dll,当然,开发环境jdk也需要使用32位版本。
开发环境说明:
win10、eclipse Photon Release (4.8.0)、jdk1.8.0_181 x86
环境部署:
1、将jacob-1.19-x86.dll复制到jdk安装目录下\jdk1.8.0_181\jre\bin目录下
2、导入jar包:jacob .jar
3、注册dm.dll,注册大漠插件这里比较麻烦,由于UAC的限制经常导致注册不成功,这里我提供给大家两个可行的方法:
方法一:将dm.dll复制到C:\Windows\SysWOW64目录下,然后右键用管理员模式运行cmd.exe,使用cmd进入目录C:\Windows\SysWOW64,然后输入命令 regsvr32 dm.dll 即可注册成功。
方法二:将dm.dll放到任意目录,最好不要有中文字符及空格,然后在同目录下新建文本文档,复制粘贴以下命令然后将扩展名改为.bat后使用右键管理员权限运行即可注册成功。
cd /d %~dp0 regsvr32 dm.dll -s
编写代码:
注意:这里的jdk一定要选择x86版本,dm.dll只能运行在x86环境中。
导入jar包:
新建一个类DamoTest:
import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.jacob.com.Variant; public class DamoTest { public static void main(String[] args) { ActiveXComponent dm = new ActiveXComponent("dm.dmsoft"); Variant ver = dm.invoke("Ver"); System.out.println(ver.getString()); Dispatch com = (Dispatch) dm.getObject(); Variant result = Dispatch.call(com, "FindWindow", "", "记事本");// 需要打开记事本notepad.exe,否则获取结果为0 System.out.println(result); } }
运行即可得到结果:
思路拓展——Java加载任意目录dll实现:
“将jacob-1.19-x86.dll复制到jdk安装目录下\jdk1.8.0_181\jre\bin目录下” 这一步是将jacob.jar所需要的dll加载到Java运行环境中,这是使用jacobjar包必不可少的操作,当我们将产品给用户使用的时候,还需要用户去手动修改本地的Java运行环境未免有些不妥,作为开发者,尽可能多得为客户着想,简化繁琐的操作是我们的宗旨,那么有没有一种方法可以省略这一步呢?
这就要考虑为什么要“将jacob-1.19-x86.dll复制到jdk安装目录下\jdk1.8.0_181\jre\bin目录下”这个问题了,原来,Java在启动的初始化过程中会自动加载\jdk1.8.0_181\jre\bin目录,被加载到Java环境中的dll才能被Java所调用,那么我们只要将dll所在目录也加载到Java的环境中即可实现任意目录放置dll文件的目的。
这里,我给大家如下代码:
private static void addLibraryDir(String libraryPath) throws Exception { Field userPathsField = ClassLoader.class.getDeclaredField("usr_paths"); userPathsField.setAccessible(true); String[] paths = (String[]) userPathsField.get(null); StringBuilder sb = new StringBuilder(); for (int i = 0; i < paths.length; i++) { if (libraryPath.equals(paths[i])) { continue; } sb.append(paths[i]).append(';'); } sb.append(libraryPath); System.setProperty("java.library.path", sb.toString()); final Field sysPathsField = ClassLoader.class.getDeclaredField("sys_paths"); sysPathsField.setAccessible(true); sysPathsField.set(null, null); }
在调用jacob.jar中的命令前先执行以上函数将dll所在的路径添加到Java的运行库中即可。
dm.dll使用方法二也可实现将dm.dll放置到任意目录,我们只要在程序中执行该段脚本命令即可。
综上,dm.dll和jacob-1.19-x86.dll实现了任意目录调用的目的。
为了方便大家使用Java进行脚本开发,本人封装了一个Java调用大漠插件的库——暂时命名为:dm4j.jar,具体说明请查看我的下一篇博客文章。
全文完。
附:
大漠插件官网:http://www.dmwebsite.net/
JACOB - Java COM Bridge下载地址:https://sourceforge.net/projects/jacob-project/files/jacob-project/
dm4j - 大漠插件Java版:介绍地址:待编辑
- 本文固定链接: https://www.coordsoft.com/post/4.html
- 转载请注明: admin 于 生活随想 - zwgu 's world 发表
《本文》有 0 条评论