刚接触java调用动态链接库,这几天踩了不少坑。先记录下来方便以后学习,也希望可以帮助到有需要的同志。由于第一次写博客,如果写的不好或者不详细请各位大神嘴下留情,多多包涵! 首先说下背景,我本人是魔兽世界忠实玩家,偶尔写下游戏脚本。去年一直使用按键精灵,大概使用了打半年也没有没检测到。今年突然一下被封了3个账号,按键精灵(个人版普通用户)试过各种办法,隐藏进程、加壳貌似都没有用。可能我技术太菜了吧!别问我为啥不开VIP,我会告诉你我很穷吗?最近发现魔兽会检测按键精灵进程(先启动游戏再启动按键结果一样),万般无奈只好另谋出路。偶然得知java原来也可以调用dll,然后就尝试的去玩一下。接下来等待我的是一个又一个坑等着我去跳,网上关于这块资料讲的不够细,导致花费了大量时间。今天写这篇文章也是希望能帮助正在爬坑的人。接下来进入正题,通过各种途径了解到java调用dll有那么几种方法:最底层的JNI、最方便的JNA、Jawin、.jacob、Jnative。在这里就不一 一说了。在这里给个建议吧!从使用方便角度来讲,java调用标准dll建议使用JNA,为什么说标准的dll呢?那是因为有些生成的dll并不是标准的,比如我正在使用的VB写的大漠插件(dm.dll)。com组件的话就使用jacob,没得说,一会我直接上码就知道了。首先说下我遇到的问题,以大漠获取鼠标位置为例(其他类型的下面链接可以找到例子)

一、JNA 方式测试  GetMousePointWindow函数

public class DllTest {

public interface Dll extends StdCallLibrary {

Dll instance = (Dll) Native.loadLibrary("d:\\dm.dll", Dll.class);

long GetMousePointWindow();

}

public static void main(String[] args) {

System.out.println("sum = " + Dll.instance.GetMousePointWindow());

}

}

结果:

java.lang.UnsatisfiedLinkError: Error looking up function 'GetMousePointWindow': 找不到指定的程序。

二、JNA 方式测试  GetCursorPos函数  (由于我本人不会C/C++,指针传值问题让我很头疼)

public interface Dll extends StdCallLibrary {

Dll instance = (Dll) Native.loadLibrary("d:\\dm.dll", Dll.class);

Long GetCursorPos(Pointer x, Pointer y);

}

public static void main(String[] args) {

Pointer x = new Memory(11) ;

Pointer y = new Memory(11) ;

Long result = Dll.instance.GetCursorPos(x, y);

System.out.println("result = "+result);

System.out.println("x = "+x);

System.out.println("y = "+y);

}

结果:

java.lang.UnsatisfiedLinkError: Error looking up function 'GetCursorPos': 找不到指定的程序

三、JACOB方式测试  GetMousePointWindow函数

ActiveXComponent ax = new ActiveXComponent("dm.dmsoft");

Variant variant = Dispatch.call(ax, "GetMousePointWindow");

System.out.println("variant = " + variant);

结果:

variant = 396170   搞定,正确得到句柄

四、JACOB方式测试 GetCursorPos 函数  (最严重的问题来了)

测试 1

ActiveXComponent ax = new ActiveXComponent("dm.dmsoft");

Pointer x = new Memory(11) ;

Pointer y = new Memory(11) ;

Variant variant = Dispatch.call(ax, "GetCursorPos",x,y);

System.out.println("variant = " + variant);

System.out.println("x = " + x);

System.out.println("y = " + y);

结果:

com.jacob.com.NotImplementedException: populateVariant() not implemented for class com.sun.jna.Memory

测试 2

ActiveXComponent ax = new ActiveXComponent("dm.dmsoft");

try {

Pointer x = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));

Pointer y = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));

Variant variant = Dispatch.call(ax, "GetCursorPos",x,y);

System.out.println("variant = " + variant);

System.out.println("x = " + x);

System.out.println("y = " + y);

} catch (NativeException e) {

e.printStackTrace();

}

结果:

com.jacob.com.NotImplementedException: populateVariant() not implemented for class org.xvolks.jnative.pointers.Pointer

测试 3

ActiveXComponent ax = new ActiveXComponent("dm.dmsoft");

try {

Variant[] var = new Variant[2];

Pointer x = new Memory(11) ;

Pointer y = new Memory(11) ;

//Pointer x = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));

//Pointer y = new Pointer(MemoryBlockFactory.createMemoryBlock(4 * 10));

var[0] = new Variant(x);

var[1] = new Variant(y);

Variant variant = Dispatch.call(ax, "GetCursorPos",var);

System.out.println("variant = " + variant);

System.out.println("x = " + x);

System.out.println("y = " + y);

} catch (NativeException e) {

e.printStackTrace();

}

结果:

com.jacob.com.NotImplementedException: populateVariant() not implemented for class org.xvolks.jnative.pointers.Pointer

测试 4

ActiveXComponent ax = new ActiveXComponent("dm.dmsoft");

int x = 0, y = 0;

Variant[] var = new Variant[2];

var[0] = new Variant(x,true);

var[1] = new Variant(y,true);

Variant variant = Dispatch.call(ax, "GetCursorPos",var);

System.out.println("variant = " + variant);

System.out.println("x = " + var[0]);

System.out.println("y = " + var[1]);

结果:

variant = 1       x = 672         y = 463      终于搞定了,我的妈啊!

简单总结:

1、标准dll推荐JNA,使用简单方便(不考虑性能情况下)、对于没有C/C++基础的人来说JNA指针的处理相对复杂

2、COM组件、非标准DLL推荐JACOB,理由很简单,看测试4变参指针(红字)使用,纯java模式

3、相对复杂,并且JNA、JACOB无法实现的部分再考虑JNI

4、因为我不了解JNATIVE,所以在这我就不做评论

5、今天就这样吧!如果有发现我这边有啥问题欢迎指正,也欢迎留言相互学习

6、在啰嗦一句,有没有人有过游戏检测CE的(可以附加进程的),我这边的可以过游戏检测,但是附加不了进程。跪求

给两个链接吧

JNA 方式

JACOB 方式(这篇文章写的相对比较全,列举了不少大漠例子)

java 如何调用大漠插件_java通过jaboc调用dll(大漠插件)遇到的坑,变参指针传参问题...相关推荐

  1. java获取get请求返回_Java中处理调用第三方接口(post/get),该如何处理,返回的数据如何处理...

    条件:1.请求URL:http://ip:port/yypt/*.jsonRequest 2.接口采用http post协议.Content-Type为application/json 调用流程: 第 ...

  2. java批量处理数据库语句_Java项目中调用bat批处理进行多用户数据库备份

    Java项目中调用bat批处理配合使用BCP进行多用户数据的备份 一.项目需求 最近项目中需要对数据库(Sql Server系列数据库)进行备份.项目中的需求不是简单的整个数据库的备份,而是根据用户来 ...

  3. python中调用函数时必须有实参_Python之函数(一)定义函数以及传参

    定义函数以及传参 函数的定义 def 函数名(): 函数体 例子: def func():#def关键字--定义 func函数名--和变量定义规则一样 ()必须要写格式 :声明 语句结束 s=[1,2 ...

  4. c语言调用dll实例 结构体传参,Matlab调用Dll,对于自定义结构体数组如何传参? - 程序语言 - 小木虫 - 学术 科研 互动社区...

    %[例子1] % Matlab调用DLL,整形数组传参 v = [1,22,33;44,-56,67]; pv = libpointer('int16Ptr',v); m = get(pv,'Valu ...

  5. java调用可执行程序 开销_java – 进行JNI调用的定量开销是多少?

    快速分析器测试产量: Java类: public class Main { private static native int zero(); private static int testNativ ...

  6. java 对第三方的异常_Java第三方API调用打开文件方法时抛出异常

    想用Java写一个音乐播放器,使用了Javazoom里的第三方API,调用打开文件的方法open(File file)时,抛出了IOException:Resetting to invalid mar ...

  7. 编写Java程序 堆栈的接口_java - 错误:调用实现接口的通用方法时,java.lang.AbstractMethodError - 堆栈内存溢出...

    我正在尝试使用javassist以编程方式创建和编译实现接口的类(在运行时). 每当我调用该动态类的实例时,都会收到以下错误消息: java.lang.AbstractMethodError: Foo ...

  8. java中调用数组参数_java中如何调用带有数组类型参数的存储过程

    java中如何调用带有数组类型参数的存储过程 关注:95  答案:3  mip版 解决时间 2021-01-28 00:39 提问者万丈深渊 2021-01-27 14:00 不知道java中java ...

  9. java调用远程 接口_java通过url调用远程接口返回json数据

    java通过url调用远程接口返回json数据,有用户名和密码验证, 转自 https://blog.csdn.net/wanglong1990421/article/details/78815856 ...

  10. Java接口调用的安全性_java编程接口调用安全性都有哪些要求

    接口调用是我们在使用java编程开发语言的时候会经常使用到的一个功能,而今天我们就通过案例分析来了解一下,java编程接口调用安全性都有哪些要求. 1.调用接口的先决条件-token 获取token一 ...

最新文章

  1. 开源社区的危机:拒绝被“白嫖”?2大著名项目遭作者破坏
  2. 知道python网课答案_Python程序设计答案
  3. C语言试题八十二之输入小写字母,把小写字母转换成大写字母。
  4. 【BZOJ1497】【codevs1789】最大获利,网络流之最大权闭合子图
  5. 有人说,30岁是程序员的一个末日期,写给30岁的程序员,到底该怎么做呢
  6. 关于计算机组件游戏,Windows系统运行库/游戏运行库组件怎么补全?
  7. python多项式求导_Python求离散序列导数的示例
  8. C语言中类型转换那些事儿
  9. matlab2010a中文,MATLAB 2010a解决中文字体乱码的方法
  10. Laravel5.1 组件 Symfony/var-dumper2.7 在php7下的问题
  11. cpu倍频怎么调_认识外频和倍频,可以极限超频,把你CPU性能发挥到最大化
  12. 多目标优化问题的研究概述(Matlab代码实现)
  13. 将titles_test表名修改为titles_2017
  14. 电子竞技——靠智力取胜的体育项目
  15. 2.2   字 母 表 和 符 号 串 的 基 本 概 念
  16. E0289错误怎么解决
  17. linux学习笔记2——ls命令说明
  18. 使用md5来实现文件去重
  19. 输出英文字母的后继字母 c语言,Java 【打印俄文的英文字母】
  20. mac 新版android studio 找不到DDMS及monitor打开白屏或报错问题

热门文章

  1. FL Studio钢琴卷轴之画笔工具
  2. 慌乱的表情,泄露了我的悲伤:伤感心情日志
  3. 503错误的原因和解决方法
  4. 【黑马程序员】vue学习笔记(未完)
  5. 2021-泛微OA V8 SQL注入漏洞
  6. python校园网站毕业设计开题报告
  7. Lipschitz continuity (利普希茨连续)
  8. 第108章 属性关键字 - Required
  9. 手机遥控器,3.5mm耳机接口红外遥控改造解析
  10. Java使用纯真IP库获取IP对应省份和城市