环境:windows XP Home版;Office2000;j2se 1.6.0(JRE也是1.6.0);Jawin 2.0-alpha1。
原由:使用Jacob访问windows下的COM组件的试验老是不成功(后来搜索到http://blog.sina.com.cn/u/435ce819010002r0,按他的办法据说可以成功),折腾了我一天。网上有说使用Jawin的,我试了一试就成功了,比Jacob顺利多了。据说Jawin比Jacob功能强大。
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该文件不存在!或者其他错误(如:运行环境问题)!");
}
}
}
转自:http://blog.163.com/a13151055695@126/blog/static/11208707420109145928636/