Java之Jacob调用COM接口DLL-----------------------------------dm。dll

摘要:
我个人认为它是由vb制作的。请务必使用32位,因为dm是免费的。所以我尝试了另一种方法来匹配jdk1.6+jacob1.9。其次,jacob与jna进行了比较,以调用实现COM接口的dll。根据对jacob提供的类的分析,发现com.jacob。com Dispatch有一个调用方法。您可以猜测如何使用java反射机制调用dll。Jna需要java和vc来实现相应的接口。在vb项目中,dm是项目名,dmsoft是类名。

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

免责声明:文章转载自《Java之Jacob调用COM接口DLL-----------------------------------dm。dll》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇java 中的 longCRC32下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

使用.Net访问Office编程接口

在这篇文章里面,我将向大家介绍如何在.Net中访问Office所公开的编程接口。其实,不管是使用哪种具体的技术来针对Office进行开发(比如VSTO,或者用C#编写一个Office Add-in,或者在一个WinForms程序中调用Office的功能,甚至在一个ASP.NET应用的服务器端启动一个Excel进程),只要是基于.Net平台,这篇文章所描述的...

C# 互操作性入门系列(四):在C# 中调用COM组件

本文转载自:https://www.cnblogs.com/zhili/archive/2013/01/27/COMInterop.html 本专题概要: 引言 如何在C#中调用COM组件——访问Office 互操作对象 在C# 中调用COM组件的实现原理剖析 错误处理 小结 一、引言 COM(Component Object Modele,组件对象模...

调用com+时,提示 0x800706f7,error msg:占位程序接收到错误数据,(本地调用时提示:不支持此接口)

(远程)调用com+时,提示 0x800706f7,error msg:占位程序接收到错误数据 解决办法: 1.通常是com+程序运行死了,只要关闭你调用的那个com+应用程序(手动建立的com+应用程序,例如我的是:SaveInv),然后再启动它. 补充: 1.如果用com+程序的那台机执行,即本地调用com+,可能会提示:"不支持此接口",解决方法同上...

创建最简单的exe形式COM组件并在MFC程序调用

来新公司学习接手新项目,拿到代码打开解决方案看到里面竟然有40几个工程,有点吃惊。具体看代码也有很多之前没见过的写法,上了几天火。 有件事就没太搞明白,按照文档的说法上层很多软件都要调用IO服务器,但看程序安装目录,IO服务器其实是一个exe程序,按照我之前的印象,能被别的程序调用的也得是动态库、静态库或者服务。实在想不通exe程序怎么作为接口被别的程序调...

当在Maven项目的pom文件当中不能下载一些jar包的时候,我们可以实现手动的下载。

今天在常见maven工程的时候,把相关的依赖加载进pom文件当中,jar包就是下载不下来。 在maven仓库当中有较低的版本,想要高点的版本,实现兼容。<dependency> <groupId>com.jacob</groupId> <artifactId>jacob</art...

tomcat 启动jacob 报错

在 resource 下创建一个 lib 将网上下载的 jacob.jar 放入其中 在 pom 文件中导入相对应的 jar 包 <dependency> <groupId>com.jacob</groupId> <artifactId>jaco...