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
    版权声明:本文为博主原创文章,转载请附上博文链接!

  • 相关阅读:
    Windows下TEX排版论文攻略—CTeX、JabRef使用心得
    Bibtex使用方法
    制作BibTex文件
    【Java集合源码剖析】Hashtable源码剖析
    【Java集合源码剖析】HashMap源码剖析
    【Java集合源码剖析】Vector源码剖析
    【Java集合源码剖析】LinkedList源码剖析
    【Java集合源码剖析】ArrayList源码剖析
    【Java集合源码剖析】Java集合框架
    css布局笔记(一)
  • 原文地址:https://www.cnblogs.com/guchunchao/p/9792676.html
Copyright © 2011-2022 走看看