首页 > 编程语言 >java jna框架免注册调用大漠插件及指针参数方法调用

java jna框架免注册调用大漠插件及指针参数方法调用

时间:2023-02-17 18:46:28浏览次数:54  
标签:插件 调用 java String dll jna dm com

大漠dll说明

1、dm.dll为com类型组件。 2、DmReg.dll 免注册为常规dll。

学习研究时的历程

1、因为大漠是com组件,所以可以使用jacob 调用大漠。但是不支持免注册dll的使用。放弃。 2、网上看的jna不支持com类型dll(其实现在是可以调用的,下文说明),但是能调用免注册dll。因此可以先是用jna调用免注册dll,然后再使用jacob创建dm对象。至此也算是实现了免注册调用dm的功能。 3、但是作为一个伪完美主义者,实在是不能忍受jacob自己还带了俩dll,并且一个项目还引用了两个相同类型的框架(jacob和jna),然后经过我的不懈努力、 不断尝试终于搞定了完全使用jna框架免注册调用dm的方法。实在是网上一点资料搜不到,并且官网文档对新手实在不友好。

jna说明

jna官网:https://github.com/java-native-access/jna

jna本身是不能调用com组件的,但是官方有提供的扩展包可以实现调用。

 

打开扩展包说明文档,惊喜的发现COM三个字母,然后机翻下大致意思是我们有两种方式可以实现调用com组件,具体使用自己看下例子吧(打开例子我当时是一脸懵)。

使用

jna有两种方式调用,

第一种是继承COMLateBindingObject,官方不推荐,而且使用也不方便。

第二种是注解方式,官方推荐,使用也简单,本文使用该方式。

maven引用

        <!--一个工具包,演示代码里有使用-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.11</version>
        </dependency>
        <!-- 扩展包已经依赖了这个,可以不用再手动引用了 -->
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna</artifactId>
            <version>5.13.0</version>
        </dependency>
        <!--jna扩展包-->
        <dependency>
            <groupId>net.java.dev.jna</groupId>
            <artifactId>jna-platform</artifactId>
            <version>5.13.0</version>
        </dependency>

 

先封装个调用免注册DmReg.dll设置大漠插件dm.dll路径的类

import cn.hutool.core.io.FileUtil;
import cn.hutool.core.lang.Console;
import com.sun.jna.Library;
import com.sun.jna.Native;
/**
 * @author sun
 **/
public class DmRegHandler {
    /**
     * jna 调用标准免注册dll
     */
    private interface DmReg extends Library {
        DmReg INSTANCE = Native.load("DmReg.dll", DmReg.class);
        /**
         * SetDllPathA  字符串(Ascii码表示插件所在的路径),整数(0表示STA,1表示MTA)
         */
        void SetDllPathA(String format, int args);
        /**
         * SetDllPathW  字符串(Unicode码表示插件所在的路径),整数(0表示STA,1表示MTA)
         */
        void SetDllPathW(String format, int args);
    }
    /**
     * 封装一个静态方法,方便调用
     */
    public static void exec() {
        new DmRegHandler().handler();
    }
    public void handler() {
        //获取dm.dll的绝对路径。
        String absolutePath = FileUtil.getAbsolutePath("dm.dll");
        Console.log("大漠插件路径:{}", absolutePath);
        DmReg.INSTANCE.SetDllPathA(absolutePath, 0);
    }
}

再建一个大漠对象对应的接口

@ComObject(progId = "dm.dmsoft") 注解 表示是一个com组件接口。progId 是大漠的对象名。

@ComMethod 注解 表示是dll方法。之后直接调用就可以使用。

指针参数:Variant.VARIANT 也就是大漠文档中说的变参指针。

这里就只粘贴几个方法,用来演示,如果需要别的方法,直接从大漠文档中复制过来 改下就行了。记得加上@ComMethod 注解。

import com.sun.jna.platform.win32.COM.util.annotation.ComMethod;
import com.sun.jna.platform.win32.COM.util.annotation.ComObject;
import com.sun.jna.platform.win32.Variant;
/**
 * @author sun
 **/
@ComObject(progId = "dm.dmsoft")
public interface ComBean {
    @ComMethod
    String Ver();
    @ComMethod
    long FindPic(int x1, int y1, int x2, int y2, String pic_name, String delta_color, double sim, int dir, Variant.VARIANT intX, Variant.VARIANT intY);
    @ComMethod
    long Reg(String reg_code, String ver_info);
    @ComMethod
    long SetPath(String path);
    @ComMethod
    String GetPath();
    @ComMethod
    long MoveTo(int x, int y);
    @ComMethod
    long LeftDoubleClick();
}

正式使用

    public static void main(String[] args) {
        //调用免注册
        DmRegHandler.exec();
        Ole32.INSTANCE.CoInitializeEx(Pointer.NULL, Ole32.COINIT_MULTITHREADED + Ole32.COINIT_SPEED_OVER_MEMORY);
        ObjectFactory objectFactory = new ObjectFactory();
        ComBean object1 = objectFactory.createObject(ComBean.class);
        Console.log(object1.Ver());
        Console.log("SetPath:{}", object1.SetPath("D:\\Users\\sun\\Desktop\\"));
        Console.log("Path:{}", object1.GetPath());
        //指针参数初始化。
        VARIANT x = new VARIANT(new IntByReference());
        VARIANT y = new VARIANT(new IntByReference());
        Console.log("FindPic:{}", object1.FindPic(0, 0, 2000, 2000, "5.bmp", "000000", 0.9, 0, x, y));
        Console.log("{}:{}", x.getValue(), y.getValue());
        object1.MoveTo(x.intValue(), y.intValue());
        object1.LeftDoubleClick();
        objectFactory.disposeAll();
    }

注意事项

1、jdk使用32位的。

2、使用管理员方式运行。

3、DmReg.dll和dm.dll放到classpath下。

 

 

 

 

 

标签:插件,调用,java,String,dll,jna,dm,com
From: https://www.cnblogs.com/enenen/p/17131206.html

相关文章

  • 在VScode中引入JAVASCript的方式
    打开VSCODE,创建一个html文件夹,shift+!快速创建代码。创建js文件,然后可以在里面定义变量,函数然后在html文件body中引入javaScript ......
  • 【eslint 插件开发】禁用 location 跳转外部链接
    背景公司h5项目需要为跳转的外部链接统一增加参数。举个例子,假设有如下代码:location.href='https://www.test.com/a?id=xxx'location.replace('https://www.test.co......
  • javascript 高级编程系列 - 迭代器/生成器
    1.迭代器(Iterator)特殊对象,具有迭代过程的接口next()方法每次调用next()方法,返回一个结果对象结果对象有两个属性value(任何类型)和done(布尔类型)当集合的值返回完时......
  • 强记 分支结构语法 java 230217
    单路分支//格式if(条件){条件成立时要做的事情;}//例子intage=19;if(age>18){System.out.println("天天网吧欢迎你");}二路分支//格式if(条件){......
  • Qt Embedded之一:简介与平台插件介绍
    常见的嵌入式Linux图形界面有Qt/Embedded、DirectFB、MicroWindows/NanoX、MiniGUI和OpenGUI等,每个GUI都有各自不同特点和应用场合,在应用编程上也各不相同。而对于......
  • 用Java实现邮件发送 SimpleMailMessage
    网上很多用Session方式那种发送,有点过于冗余,需要在POM文件里添加依赖有一个文章更详细可以参考:https://www.php.cn/manual/view/22279.html<dependency><......
  • Java工具类Collections
    一、概述Collections工具类提供了大量针对Collection和Map的操作,都为静态(static)方法,总体可分为四类:排序操作查找、替换操作同步控制设置不可变(只读)集合二、排......
  • 关于静态代码块和匿名代码块以及结构体在程序运行过程中的调用顺序实验(续)
    关于静态代码块和匿名代码块以及结构体在程序运行过程中的调用顺序实验(续)之前发过一篇博客讲述自己对静态代码块、匿名代码块以及结构体在程序中运行结果的小实验。本次再......
  • 求1到100的总和 java 230217
    新增一个变量s保存总结果给这个s初始化值为0每次得到循环的数字后就给这个变量s进行累加代码:publicclassTest{publicstaticvoidmain(String[]args){//......
  • 主页面、iframe之间调用以及传值
    主页面、iframe之间的调用和传值,无非就是两个交互形式:主页面与子页面的交互子页面之间的交互接下来要讲的是四种交互传值的方式:利用postMessage方法传值、DOM操作传值......