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该文件不存在!或者其他错误(如:运行环境问题)!");

}

}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值