`

java调用dll

阅读更多
一.在程序用jnative调用window的dll

1.   安装

http://sourceforge.net/projects/jnative

解压后得到3个文件:JNativeCpp.dll,libJNativeCpp.so,JNative.jar,其中:

JNativeCpp.dll     放在windows/system32目录下

libJNativeCpp.so    linux下使用

JNative.jar          导入工程中

2.   使用

2.1.     加载dll文件

JNative可使用两种方式加载dll文件:

a.使用System.loadLibrary加载,使用此方法可加载系统目录中的dll文件。

b.可以先把dll文件复制到system32目录下,使用文件前缀名作为参数来加载dll文件。使用System.load加载,此方法参数为dll文件全路径名。

2.2.     调用函数

a、首先创建JNative对象:

JNative jnative = new JNative(dll文件名, 函数名);

b、设置返回值类型:

jnative.setRetVal(Type.INT);

c、设置参数

jnative.setParameter(0, Type.STRING, …); //设置第一个参数为字符串

jnative.setParameter(1, Type.INT, String.valueof(…));       //设置第二个参数为整数

d、执行

n.invoke();

e、获取返回值

Integer.parseInt(jnative.getRetVal());

3.实例

import org.xvolks.jnative.JNative;

import org.xvolks.jnative.Type;

import org.xvolks.jnative.exceptions.NativeException;

import org.xvolks.jnative.pointers.Pointer;

import org.xvolks.jnative.pointers.memory.HeapMemoryBlock;

public class Test {

       public static void main(String[] args) throws NativeException, IllegalAccessException {

       JNative v=new JNative("Kernel32.dll","GetModuleFileNameA");

        int i = 0;

        v.setRetVal(Type.INT);

        Pointer pName = new Pointer(new HeapMemoryBlock(1024));

       

        v.setParameter(i++, 0);//module handle

        v.setParameter(i++, pName);//pFileName

        v.setParameter(i++, 1024);//nSize

        v.setRetVal(Type.INT);

        v.invoke();

        int ret = Integer.parseInt(v.getRetVal());

        if (ret == 0) {

            // return "null";

            System.err.println(

                    "GetModuleFileName failed!");

        } else {

           

            String path = pName.getAsString().substring(0,

                    ret);

            pName.dispose();

            v.dispose();

            System.out.println("current process's path is:"+path);

        }

    }



}





4.注意:

在JNative中用了JDK1.5的一些特性,如枚举、静态引入等,所以在JDK1.4下是不能用的。

二.在程序用jawin调用window的dll

jawin 可以对dll中的方法进行调用,也可以调用com中的方法.内部还提供了一个工具,直接对 com组件导出成 java的类,个人认为很方便。

下面是我们作的一个测试,很顺利便通过了。

1、下载jawin:http://jawinproject.sourceforge.net/。

2、配置:

    a.将jawin.jar放于%JAVA_HOME%"jre"lib"ext下。

    b.将jawin.dll放于c:"winnt"system32下。否则将出现错误:COMException : no jawin in java.library.path;

    也可将jawin.dll放于每个项目目录下。



   c.至此在Editplus中调试Jawin/NJawin的例子,可以通过。而在Eclipse中有时还会出上面的错误:COMException : no jawin in java.library.path。

   d.在Eclipse中,菜单->window->preference->Java->installed JREs 将原来的remove,重新建一个指到你的java sdk目录。 ok了。

3、程序测试:



import org.jawin.FuncPtr;



import org.jawin.ReturnFlags;



public class GfJawinTest {



       public static void main(String[] args) {



              try {



                     FuncPtr msgBox = new FuncPtr("USER32.DLL", "MessageBoxW");

                     msgBox.invoke_I(0, "Hello From a DLL", "From Jawin", 0, ReturnFlags.CHECK_NONE);

              } catch (Exception e) {



                     e.printStackTrace();



              }



       }



}





4.利用jawin调用com组件, 如word:

//创建word

import org.jawin.DispatchPtr;

import org.jawin.win32.Ole32;

public class CreateWord {



       public static void main(String[] args) {

              try {

                     Ole32.CoInitialize();//                   初始化

                     DispatchPtr app = new DispatchPtr("Word.Application");//               创建word对象

                     app.put("Visible",true); //                     使word可见

                     DispatchPtr docs=(DispatchPtr)app.get("Documents"); //                 获得document对象集合

                     DispatchPtr doc=(DispatchPtr)docs.invoke("Add"); //                    新增一个文档

                     app.invoke("Activate"); //                    激活当前文档

                    

                     DispatchPtr objTextFont=(DispatchPtr)((DispatchPtr)doc.get("Content")).get("Font");

//                   取得Font对象

                     objTextFont.put("Name","黑体");

//                   设置字体

                     objTextFont.put("Size","48");

//                   设置字号

                     DispatchPtr docSelection=(DispatchPtr)app.get("Selection");

//                   取得Selection对象

                     docSelection.invoke("TypeText","Jawwintesttext!"nJawin测试文本。");

//                   使用TypeText方法添加文本

                     doc.invoke("SaveAs","d:""jawintest.doc");

//                   保存文档(保存在C盘根目录下)

                     doc.invoke("Close");

//                   关闭当前文档,去掉前面的注释符并重新编译后可生效

                     app.invoke("Quit");

//                   退出Word,去掉前面的注释符并重新编译后可生效



                    

                     Ole32.CoUninitialize(); //                     释放对象

              } catch (Exception e) {

                     e.printStackTrace();

              }

       }



}



//打开word

import org.jawin.DispatchPtr;

import org.jawin.win32.Ole32;



public class OpenWord {

       public static void main(String[] args) {

              try {

                     Ole32.CoInitialize();

                     DispatchPtr app = new DispatchPtr("Word.Application");

                     app.put("Visible", true);

                     DispatchPtr docs = (DispatchPtr) app.get("Documents");

                     DispatchPtr doc = (DispatchPtr) docs.invoke("Open", "d:""word.doc");

                     Ole32.CoUninitialize();

              } catch (Exception e) {

                     e.printStackTrace();

              }

       }

}



//调用word中的另存为,保存为.html

import org.jawin.DispatchPtr;

import org.jawin.win32.Ole32;



public class Word2Html {

       public static void main(String[] args) {



              String path = "e://17001939578.doc";

              int iPos = path.lastIndexOf(".");

              String fileExtName = path.substring(iPos + 1);

              String fileMainName = path.substring(0, iPos);

              fileExtName = fileExtName.toLowerCase();

              try {

                     Ole32.CoInitialize();

                     // 初始化

                     DispatchPtr app = new DispatchPtr("Word.Application");

                     // 创建word对象

                     app.put("Visible", false);

                     // 设置word不可见

                     DispatchPtr docs = (DispatchPtr) app.get("Documents");

                     // 取得Documents对象

                     DispatchPtr doc = (DispatchPtr) docs.invoke("Open", path);

                     // 打开指定的word文件

                     doc.invoke("SaveAs", fileMainName + ".html");

                     // 另存为HTML文件

                     app.invoke("quit");

                     // 关闭word

                     Ole32.CoUninitialize();

                     // 释放对象

                     System.out.println(""n转换完成!");

                     System.out.println(""n文件名:" + fileMainName + ".html");

              } catch (Exception e) {

                     System.out.println(""n该文件不存在!或者其他错误(如:运行环境问题)!");

              }

       }

}
分享到:
评论

相关推荐

    Java调用动态链接库(Java 调用 DLL)

    在实际项目中,Java调用DLL通常用于利用已有的C/C++库,或者执行一些Java不擅长的任务,如硬件控制、图形处理等。然而,由于涉及到本地代码,这也会增加程序的复杂性和维护难度,因此在选择这种方法时需要权衡利弊。...

    Java调用DLL源代码

    Java调用DLL是Java开发中一个重要的技术主题,它允许Java程序与本地操作系统API或者其他C/C++编写的动态链接库进行交互。在Java中,有多种方法可以实现这个功能,其中最常用的是Java Native Interface (JNA) 和 ...

    java调用DLL文件

    总结来说,Java调用DLL文件主要依赖于JNative库,通过定义Java接口、加载DLL、获取函数句柄、创建代理对象以及调用函数等步骤实现。这种方法使得Java开发者能够充分利用C/C++库的功能,同时也保持了Java的跨平台特性...

    Java调用dll实现des加密解密

    总的来说,通过Java调用DLL实现DES加密解密涉及了Java和C/C++的混合编程,需要理解JNI的工作原理,以及如何在C/C++中与DLL交互。这个过程对于那些希望在Java中利用已有的本地库功能的开发者来说是至关重要的。

    Java调用dll示例

    总结来说,Java调用DLL主要涉及JNI的使用,包括在Java中声明native方法,生成JNI头文件,编写C++代码实现接口,编译链接DLL,以及在Java中加载和调用DLL。这个过程允许Java开发者充分利用C++的高性能特性,同时保持...

    JAVA调用DLL方法 JAVA调用DLL方

    ### JAVA调用DLL方法 在跨平台开发领域中,Java作为一种强大的编程语言,因其具有良好的移植性和跨平台性而被广泛使用。然而,在某些特定情况下,我们可能需要调用本地库(例如DLL文件)来实现特定功能或提高性能。...

    java调用dll最简单的方法

    在Java中调用DLL(Dynamic Link Library)文件,可以使用Java的本地方法接口(JNI,Java Native Interface)来实现。JNI允许Java程序与本地代码进行交互,从而实现跨平台的功能。

    java调用dll文件的实例

    Java调用DLL文件是将Java程序与C/C++编写的动态链接库集成的一种技术,主要通过JNI(Java Native Interface)来实现。JNI是Java平台的标准部分,它允许Java代码和其他语言写的代码进行交互。在本实例中,我们将探讨...

    java调用DLL:JNative

    ### Java调用DLL:JNative概述 在Java项目中,有时候需要调用本地系统的动态链接库(DLL)来实现特定的功能。传统的做法是通过Java Native Interface (JNI)来进行调用,但这往往涉及到复杂的配置和繁琐的过程。为了...

    jna jar实现java调用dll

    JNA是实现Java调用DLL的关键工具,DLL是Windows操作系统中的本地库,而“java调用dll”是整个过程的目标。 在压缩包子文件的文件名称列表中,只有一个文件名"testmj"。通常,这可能是一个测试类或者包含主方法的...

    Java调用dll文件开源组件jar包及说明文档

    Java调用DLL文件是软件开发中的常见需求,尤其是在Java与C/C++混合编程时。`JNative-1.3.2`是一个开源组件,专门设计用于帮助Java应用程序调用Windows平台上的DLL(动态链接库)文件,同时也支持Linux平台下的SO...

    java调用dll接口

    本主题聚焦于"Java调用DLL接口",这是一个允许Java代码利用Windows系统上的DLL功能的技术。 DLL(Dynamic Link Library)是微软Windows操作系统提供的一种机制,它包含了一组可执行函数和变量,可供多个程序同时...

    Java调用dll

    Java调用DLL是一种常见的跨语言交互技术,允许Java应用程序利用C++编译的动态链接库(DLL)中的功能。在本场景中,我们有一个Win7 64位系统,使用了1.6版本的JDK,并且用Visual Studio C++创建了一个64位的DLL。以下...

    java调用dll新

    总结,Java调用C++ DLL的过程主要包括:编写C++ DLL、创建Java JNI接口、生成JNI头文件、实现JNI接口并编译为DLL、最后在Java程序中加载和调用DLL。这个过程虽然有些复杂,但能充分利用现有C++库,拓展Java的功能。...

    java调用dll必备jar包

    Java调用DLL(动态链接库)是Java编程中的一项高级技术,主要应用于Java与本地代码交互,例如在Java中利用C++或C编写的库。本文将详细介绍如何使用Java调用DLL以及所需的必备jar包。 首先,Java并不直接支持DLL的...

    亲测可用,java 成功调用dll函数。包含调用回调函数,springboot版本。最近由于公司业务需要,要调用dll文件,用JNA调用。

    Java调用DLL函数是跨平台编程中的一种常见需求,特别是在Java与C/C++代码交互时。JNA(Java Native Access)是Java平台上的一个库,它允许Java代码直接调用本机库(如DLL文件)的函数,而无需编写JNI(Java Native ...

    Java调用DLL例子

    本示例以"Java调用DLL例子"为主题,使用了JNative库作为接口来实现Java调用本地动态链接库。 JNative是一个开源的Java库,它提供了一种方法使得Java程序能够直接调用C/C++编写的函数,从而间接实现了调用DLL的功能...

    JAVA-dll-ocx.rar_Java调用dll_dll ocx_java EdisonSmsGw.ocx_java 调用o

    Java调用DLL和OCX是将Java语言与Windows平台下的动态链接库(DLL)和控件(OCX)集成的一种技术。DLL是Windows系统中的一种共享库,它包含可由多个程序同时使用的代码和数据。而OCX是ActiveX控件,主要用于Windows...

    java调用dll实现键盘的屏蔽

    标题中的“java调用dll实现键盘的屏蔽”指的是在Java程序中通过动态链接库(DLL)来阻止键盘输入。这是一个常见的需求,特别是在自动化测试、安全软件或者某些特殊应用环境中,可能需要防止用户通过键盘进行输入干扰...

Global site tag (gtag.js) - Google Analytics