51CTO曾经为大家讲过“Java与.NET的 WebServices相互调用”,但是如何实现Java调用.net DLL的方法呢?我们在网上搜索了一番,也没找到啥东西,甚至看到人扬言此事绝无可能。本文将详细为大家介绍一个java调用.net DLL的方法,以实现特殊的客户的特殊要求:“在Java项目中必须使用其提供的用.net写的DLL加密机制!”
环境与工具:
◆.net framework 3.5 C#
◆java jdk1.5, Tomcat 5.5
◆jacob-1.15-M3
实现例子:
一、C# 制作Com组件
新建一个Class 项目,取名TestCom
代码
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Runtime.InteropServices;
- namespace TestCom
- {
- [Guid("E9BCF867-CD81-40d0-9591-ED28D1ED2B53")]
- public interface IEncrypt
- {
- [DispId(1)]
- string GetEncrypt(string str,string str2);
- }
- [Guid("33A6E58D-E1F5-4b53-B2E2-03B9F8BA2FAD"), ClassInterface(ClassInterfaceType.None)]
- public class Encrypt:IEncrypt
- {
- public Encrypt(){}
- public string GetEncrypt(string str,string str2)
- {
- return "测试 | "+str+"|"+str2;
- }
- }
- }
打开 Project--> Properties菜单 在Application标签中打开 Assembly Information 将Make assembly Com-Visible一项选中。再切换到Build标签将 Register for COM interop一项选中。
Guid的生成:打开Visual Studio Command Prompt 输入guidgen 命令调出工具。类型选择Registry Format,点击New Guid,然后COPY出来。
[DispId(1)]为函数的标识。如果有多个函数可相应的在函数前面加[DispId(2)], [DispId(3)]…
编译程序Debug目录中会生成 TestCom.dll 和TestCom.tlb
手工注册Com方法:
打开Visual Studio Command Prompt进入Debug目录,运行命令注册:regasm TestCom.DLL /tlb:TestCom.tlb
二、Java调用Com
部署jacob
◆在开发环境中引入jacob.jar
◆拷贝jacob-1.15-M3-x86.dll 文件到 C:\Windows\System32目录,如果是Web应用的话还需要拷贝到jdk1.5.0_16\bin目录(jdk安装目录下的bin目录)
java调用代码
代码
- import com.jacob.activeX.ActiveXComponent;
- import com.jacob.com.ComThread;
- import com.jacob.com.Dispatch;
- import com.jacob.com.Variant;
- public class test {
- /**
- * @param args
- */
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try{
- ActiveXComponent dotnetCom = null;
- dotnetCom = new ActiveXComponent("TestCom.Encrypt");
- Variant var = Dispatch.call(dotnetCom,"GetEncrypt","哥是第一个参数","哥是第二个参数");
- String str = var.toString(); //返回值
- } catch (Exception ex) {
- ex.printStackTrace();
- }
- }
- }
这便完成了Java调用.net DLL的方法!
原文地址:http://www.cnblogs.com/windsor/archive/2010/06/17/1759289.html
一、 准备工作
先了解一下概念,JACOB 就是 JAVA-COM Bridge的缩写,提供自动化的访问com的功能,也是通过JNI功能访问windows平台下的com组件或者win32系统库的。这是一个开始于 1999年的开源项目的成果,有很多使用者对该项目进行了修改,做出了自己的贡献。
Jacob下载地址:http://sourceforge.net/project /showfiles.php?group_id=109543&package_id=118368
我在这里下载了Jacob1.14.3和jacob1.9的版本两个版本
这里下载的是目前最新的Jacob1.14.3的Release版。
另外java操作word方式还有(个人认为通过jacob最好,自己可以扩展,网上除poi之外几乎全是java-com技术实现的):
(1):Apache POI - Java API To Access Microsoft Format Files(http://poi.apache.org/);对word处理不够强处理Excel功能可以,但是全是通过java完成的,不需 要com组件支持;
(2):java2word 是一个在java程序中调用 MS Office Word 文档的组件(类库)。该组件提供了一组简单的接口,以便java程序调用他的服务操作Word 文档。(好象也是用的java-com技术);
(3)web开发语言操作word的功能最好还是用第三方的控件, 看看这个SOAOFFICE,还可以使用js 写VBA呢 http://www.kehansoft.com/soaoffice/doclist.asp
二、安装Jacob
Jacob的安装非常的简单,我们解开下载的jacob_1.9.zip,在文件夹中找到jacob.dll和jacob.jar两个文件,如 果是 Jacob1.14.3则是jacob-1.14.3-x86.dll(32位,机和jacob-1.14.3-x64.dll(64位)和 jacob.jar两个文件。Jacob.dll直接放到系统的system32文件夹下就行了,连注册都不用的(或者拷贝到jdk或者jre的bin目 录下也行,当前测试文件所在的目录也行,就是只要在java.library.path中就可以)。而jacob.jar设置到classpath中去就 可以了,或者在IDE开发环境的工程中设置扩展库也一样的,我是这样使用的将jacob-1.14.3-x86.dll或复制 到%Tomcat5%\bin目录下将jacob.jar复制到%Tomcot5%\Share\lib目录下,我使用过程中感觉放到这里是一个最终解决 办法,当你放哪都有问题的时候。我这样用之后再没有出过因为系统不一样出现的各种各样的问题,当然你作的是web的项目。
注意使用jacob一写要安装word,我装的word2003,如果是操作word2007就不用jacob了(好像这方面的API)。
对jacob.dll几种配置方法 (网上看到):
2008-07-31 11:59:49
1、把jacob.dll文件,复制到 windows\system32 目录下。(注:我用的时候这个方法不能运行)
2、 把jacob.dll放入 Java\jdk1.5.0_06\jre\bin目录下.把jacob.jar放入 Java\jdk1.5.0_0\jre\lib\ext目录下.可以正常运行。
3、把jacob.dll放入 \glc\src目录下.把jacob.jar放入WEB-INF\lib目录下,也是可以正常运行。
三、使用(以下是我改写的一个word操作类,希望有兴趣的朋友完善,记得发给我一份)
小觅向大家问好:
废话多多:
JACOB在很长一段时间收到各位JAVA编程人士的重用,许多和小寻一样热 爱编程的朋友找到我讨论各种关于JACOB的问题,在这些前来讨论技术的朋友当中,不少朋友是第一次接触,被JACOB语法所迷惑,不知所措,为了让大家少 走冤枉路,小寻特意写下这篇文章,由于本人技术浅薄,如有不足,还请批评指正。
如何下载:
JACOB是来自danadler.com公司的开源产品, 大家以往都是通过http://danadler.com对该公司的主页做访问,但是你现在打开会看到“Internet Explorer 无法显示该网页” 如果我没记错我们以往 使用的jacob_1.9.zip、jacob_1.7.zip都是从http://danadler.com/jacob 处下载的,但目前看来这个网址不可用了。做一下搜索,发现sourceforge.net 有一个叫jacob的项目,想是该公司搬家了吧!通 过http://sourceforge.net/projects/jacob-project/ 我们访问到该工程主页,然后下载jacob-project 1.14.3 晕连版本也变了,再也找不到那些老版本了(大家如果有老版本的下载地址一定 要留言通知小弟,感激不尽!!!)
源代码下载:jacob-1.14.3_src.zip
代码包下载:jacob-1.14.3.zip
API分析:(jacob-
JACOB里的总共有两个包:
com.jacob.activeX:JACOB可以通过它调度(Dispatch)activeX 控件
com.jacob.com:JACOB通过它调用系统DLL
(activeX是由微软公司推出的用于Internet的技术,以前曾经被称为OLE 和OCX,activeX
web插件可以用于各种非HTML的工作,比如,对MicrosoftExcel
或
MicrosoftWord 文件做
操作、解析JS,VB脚本、播放FALSH、调用Microsoft
MediaPlayer等.)
(更多关于activex和COM:http://www.itcups.com/Articals/Artical_10121.html)
内部结构:
有一点可以确定的是在JACOB内部,com.jacob.activeX是建立在com.jacob.com之上的。
而com.jacob.com中有一个很基础的类com.jacob.com.JacobObject
其中比较常用的两个类com.jacob.com.Dispatch和com.jacob.com.Variant便是继承自它。(com.jacob.com.Dispatch;里面提供了调度MS windows系统API,比如进程的管理。com.jacob.com.Variant; 里面数据类型的转换的方法,Variant类本身是JACOB的最最基本的数据类,他可以被转 换成任何的类,如: 使用toDispatch();可以将Variant转化成Dispatch对象。)
com.jacob.com中还有其他的一 些类不是建立在JacobObject之上的,如com.jacob.com.ComThread(负责COM线程管 理。)
com.jacob.com所有的类,包括上面说到的JacobObject、ComThread,都是通过com.jacob.com.LibraryLoader中的loadJacobLibrary()方法:
static
{
LibraryLoader.loadJacobLibrary();
}
调用jacob.dll内的方法,比如:Dispatch.java就通过LibraryLoader和Dispatch.h、Dispatch.cpp建立联系。
从而建立起java到jacob.dll到jni的之间的联系。