首页 > Java > 使用Java调用大漠插件的方法
2018
10-10

使用Java调用大漠插件的方法

        大漠插件是一款出色的脚本制作插件,几乎所有的游戏脚本开发者都知道这款插件,足以说明它的影响力。官网写道:大漠综合插件 (dm.dll)采用vc6.0编写,识别速度超级快!采用COM接口编写,适用于所有语言调用。但是据我所了解,超过半数以上的大漠插件使用按键精灵或者易语言进行开发,使用Java作为开发语言使用大漠插件的寥寥无几。Java作为优秀的编程语言,自然拥有众多开发者,百度关键字“Java调用大漠插件”,搜索结果几乎全是提问如何使用Java调用的,最近刚好需要,所以研究了一下具体如何实现。

未命名1539177240.jpg

        大漠插件 (dm.dll)采用COM接口编写,所以问题也就变成了Java如何调用COM组件,JACOB - Java COM Bridge是一个Java中专门调用COM组件的工具,我们就使用它来实现需求。下载完毕解压之后目录结构如下:

未命名1539179228.jpg

        注意,由于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环境中。

                

image.png

                        导入jar包:

image.png

                        新建一个类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);
            }
        }

                        运行即可得到结果:

image.png

        思路拓展——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版:介绍地址:待编辑


本文》有 0 条评论

留下一个回复