java 如何调用大漠插件_java通过jaboc调用dll(大漠插件)遇到的坑,变参指针传参问题...
刚接触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(大漠插件)遇到的坑,变参指针传参问题...相关推荐
- java获取get请求返回_Java中处理调用第三方接口(post/get),该如何处理,返回的数据如何处理...
条件:1.请求URL:http://ip:port/yypt/*.jsonRequest 2.接口采用http post协议.Content-Type为application/json 调用流程: 第 ...
- java批量处理数据库语句_Java项目中调用bat批处理进行多用户数据库备份
Java项目中调用bat批处理配合使用BCP进行多用户数据的备份 一.项目需求 最近项目中需要对数据库(Sql Server系列数据库)进行备份.项目中的需求不是简单的整个数据库的备份,而是根据用户来 ...
- python中调用函数时必须有实参_Python之函数(一)定义函数以及传参
定义函数以及传参 函数的定义 def 函数名(): 函数体 例子: def func():#def关键字--定义 func函数名--和变量定义规则一样 ()必须要写格式 :声明 语句结束 s=[1,2 ...
- c语言调用dll实例 结构体传参,Matlab调用Dll,对于自定义结构体数组如何传参? - 程序语言 - 小木虫 - 学术 科研 互动社区...
%[例子1] % Matlab调用DLL,整形数组传参 v = [1,22,33;44,-56,67]; pv = libpointer('int16Ptr',v); m = get(pv,'Valu ...
- java调用可执行程序 开销_java – 进行JNI调用的定量开销是多少?
快速分析器测试产量: Java类: public class Main { private static native int zero(); private static int testNativ ...
- java 对第三方的异常_Java第三方API调用打开文件方法时抛出异常
想用Java写一个音乐播放器,使用了Javazoom里的第三方API,调用打开文件的方法open(File file)时,抛出了IOException:Resetting to invalid mar ...
- 编写Java程序 堆栈的接口_java - 错误:调用实现接口的通用方法时,java.lang.AbstractMethodError - 堆栈内存溢出...
我正在尝试使用javassist以编程方式创建和编译实现接口的类(在运行时). 每当我调用该动态类的实例时,都会收到以下错误消息: java.lang.AbstractMethodError: Foo ...
- java中调用数组参数_java中如何调用带有数组类型参数的存储过程
java中如何调用带有数组类型参数的存储过程 关注:95 答案:3 mip版 解决时间 2021-01-28 00:39 提问者万丈深渊 2021-01-27 14:00 不知道java中java ...
- java调用远程 接口_java通过url调用远程接口返回json数据
java通过url调用远程接口返回json数据,有用户名和密码验证, 转自 https://blog.csdn.net/wanglong1990421/article/details/78815856 ...
- Java接口调用的安全性_java编程接口调用安全性都有哪些要求
接口调用是我们在使用java编程开发语言的时候会经常使用到的一个功能,而今天我们就通过案例分析来了解一下,java编程接口调用安全性都有哪些要求. 1.调用接口的先决条件-token 获取token一 ...
最新文章
- 开源社区的危机:拒绝被“白嫖”?2大著名项目遭作者破坏
- 知道python网课答案_Python程序设计答案
- C语言试题八十二之输入小写字母,把小写字母转换成大写字母。
- 【BZOJ1497】【codevs1789】最大获利,网络流之最大权闭合子图
- 有人说,30岁是程序员的一个末日期,写给30岁的程序员,到底该怎么做呢
- 关于计算机组件游戏,Windows系统运行库/游戏运行库组件怎么补全?
- python多项式求导_Python求离散序列导数的示例
- C语言中类型转换那些事儿
- matlab2010a中文,MATLAB 2010a解决中文字体乱码的方法
- Laravel5.1 组件 Symfony/var-dumper2.7 在php7下的问题
- cpu倍频怎么调_认识外频和倍频,可以极限超频,把你CPU性能发挥到最大化
- 多目标优化问题的研究概述(Matlab代码实现)
- 将titles_test表名修改为titles_2017
- 电子竞技——靠智力取胜的体育项目
- 2.2 字 母 表 和 符 号 串 的 基 本 概 念
- E0289错误怎么解决
- linux学习笔记2——ls命令说明
- 使用md5来实现文件去重
- 输出英文字母的后继字母 c语言,Java 【打印俄文的英文字母】
- mac 新版android studio 找不到DDMS及monitor打开白屏或报错问题