zoukankan      html  css  js  c++  java
  • Java之Jacob调用COM接口DLL-----------------------------------dm。dll

    用Java控制windows了,嗯,低层次按键模拟,可控制游戏,内存也不在话下。

    一、环境介绍

    1、myeclipse8.5

    2、著名按键插件dm。dll  32bit。此插件实现COM接口,百度百科说是vc6.0编的。

    PS:真™坑爹,害我跑去研究jna了。个人觉得是vb编的。

    3、jdk1.8 32位。一定要32位,因为免费dm。dll也是32位。

    4、jacob.jar     jacob-1.18-x86.dll

    5、win7 64bit

    ps:myeclipse8.5版本低了,不支持jdk1.8,连String.contains()都用不了。

    所以我试了另一种搭配jdk1.6+jacob1.9可行

    二、jacob与jna对比

    jacob用来调用实现COM接口的dll。根据分析jacob提供的类,发现com.jacob.com.Dispatch有invoke方法。可以猜到使用java反射机制的方式调用dll。那么你只要dll的api,以传入类名、方法名、参数方式就可以调用dll。

    jna一般用来调用vc编dll。jna要求java和vc必须实现相应的接口。

    蛋疼啊,在dll没有实现接口,java这边实现也不顶用。

    要是有100个方法就要声明100遍,要是有一万个呢。

    所以说,就方式而言,明显jacob更胜一筹。

    三、开干

    1、注册dm。dll

    以管理员运行dos,输入一下。ps:一定要以管理员运行。快捷键不行的。

    regsvr32 "C:xxxxxxdmPluginRegisterdm点dll"   。。。替换掉汉字。路径填你自己的。

    2、eclipse中新建一个java工程

    引入jacob.jar

    3、jacob-1.18-x86.dll放入path

    加入运行环境也行,我是将jacob-1.18-x86.dll拷入入java的bin目录

    4、哎呀实验了好多次才成功的怎么几句话就完了。。。

    好吧,来讲解一下代码吧

    只是个测试类,新建并打开newFile.txt。运行代码

    public class DmDllTest {
        public void changeWindowTitleTest() {
     
            try {
                //初始化
                ComThread.InitSTA();  
                
                /*
                 * 调用dm.dmsoft
                 * only in the sense that it is used for creating Dispatch objects
                 */
                ActiveXComponent axc = new ActiveXComponent("dm.dmsoft");
                //get MS level dispatch object
                Dispatch myCom = (Dispatch) axc.getObject();
                
                //查找到名为newFile.txt的句柄
                Variant result = Dispatch.call(myCom, "FindWindow" , "" , "newFile.txt");
                
                //改变窗口title
                Dispatch.call(myCom, "SetWindowText" , result , "newFileChange.txt");
                
                //释放资源
                ComThread.Release(); 
            } catch (Exception e) {
                
                e.printStackTrace();
                
            }
            
            
        }
     
        public static void main(String[] args) {
            new DmDllTest().changeWindowTitleTest();
        }
     
    }

    可以发现窗口标题变成 newFileChange.txt


    dm.dmsoft参数,因为刚才注册dll到系统了,所以系统知道。那么在vb(vc)项目中,dm是工程名,dmsoft是类名。

    ps:这个参数一直搞不懂,网上也找不到一片像样汉语教程(全是不带注释的操作excel、word之类),后来找到老外的一片文章,才搞懂含义。

    Dispatch myCom = (Dispatch) axc.getObject();

    呵呵,这样我们就获取了dll的资源了,只需要再call一下方法,第二个参数是方法名(方法名可以通过dll的api获得),后面的为参数,可以按要求传无限个。

    通过查阅api,可以发现按键、内存都不在话下。

    。。。没什么要讲的了,其实老鸟一看代码就懂了。

    ---------------------
    作者:止聒
    来源:CSDN
    原文:https://blog.csdn.net/cb44606/article/details/50060185?utm_source=copy
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法输入日志标题
    Linux下安装oracle数据库提示DISPLAY not set. Please set the DISPLAY and try again。
    redhat 关机注销命令详解
    VirtualBox的四种网络连接方式
    修改RedHat的系统显示时间
    insufficient memory to configure kdump(没有足够的内存)解决方法(待验证、待解决)
    xen坑随笔 heartbeat dpkg垃圾数据库清除
    tomcat 监控脚本
    负载均衡随笔
    GIT命令介绍
  • 原文地址:https://www.cnblogs.com/guchunchao/p/9792676.html
Copyright © 2011-2022 走看看