利用jawin完成window中dll的调用

1、下载jawin:[url]http://jawinproject.sourceforge.net/[/url]。
2、配置:
》将jawin.jar放于%JAVA_HOME%\jre\lib\ext下 。
》将jawin.dll放于c:\winnt\system32下。否则将出现错误:COMException : no jawin in java.library.path;
也可将jawin.dll放于每个项目目录下。

》至此在Editplus中调试Jawin/NJawin的例子,可以通过。 而在Eclipse中有时还会出上面的错误:COMException : no jawin in java.library.path。
》在Eclipse中,菜单->window->preference->Java->installed JREs 将原来的remove,重新建一个指到你的java sdk目录。
》 ok了。
3、程序测试:

import org.jawin.funcptr;
import org.jawin.returnflags;
public class createppt {
public static void main(string[] args) {
try {
funcptr msgbox = new funcptr("user32.dll", "messageboxw"); //获得函数指针
msgbox.invoke(0, "hello from a dll", "from jawin", 0, returnflags.fail_on_false);
/*1. 指令字符串。一个"XXX:Y:ZZZ"格式的字符串。其含义分别是传入参数中的每个字节的数据类型意义、返回值的类型、需要从传入指针中读取的数据(inout类型参数)。比如:

函数签名int func(int, int, struct s*, char*); //其中struct s*调用完函数后需要读出,struct s所占字节数为16。

其指令字符串为:IIP16G:I:L4L4n16L4。该字符串在解析返回值(字节数组)时,首先应该是返回类型I对应的4个字节,然后是inout类型的参数中n16对应的16个字节。

其中字符串的意义可以在Jawin提供的文件instructions.h中找到,或者在官方文档(Jawin数据指令)中找到常用的一些指令字符串的意义。

2. 传入参数的总字节大小。

3. 前面写好的传入参数的原始字节流。

4. 一个object数组。

5. ReturnFlags,用以根据C/C++返回值将C/C++的错误转换为Java的异常并抛出。其中CHECK_NONE表示不检查;CHECK_FALSE和CHECK_WIN32分别表示返回0是FALSE和SUCCESS,根据是否出错决定是否抛出异常;CHECK_HRESULT表示使用COM模型中的HRESULT作为返回值,其错误码可以配置。

*/
} catch (exception e) {
e.printstacktrace();
}
Jawin的使用步骤:

1.环境配置:下载Jawin;Jawin.dll放入工程目录下;Jawin.jar相关jar文件加入到运行库中(LibPath或者Eclipse下配置工程的BuildPath-AddLibrary)。

2.获得函数指针:new FuncPtr("DllFileName.DLL", "dllFunctionName");

3.用LittleEndianOutputStream将函数需要的参数写入到一个原始字节流NakedByteStream。

4.最重要的一步:调用FuncPtr.invoke()。传入参数比较复杂。

5.解析上一步的返回值(字节数组)。

第4步中传入的参数包括:

1.指令字符串。一个"XXX:Y:ZZZ"格式的字符串。其含义分别是传入参数中的每个字节的数据类型意义、返回值的类型、需要从传入指针中读取的数据(inout类型参数)。比如:

函数签名int func(int, int, struct s*, char*); //其中struct s*调用完函数后需要读出,struct s所占字节数为16。

其指令字符串为:IIP16G:I:L4L4n16L4。该字符串在解析返回值(字节数组)时,首先应该是返回类型I对应的4个字节,然后是inout类型的参数中n16对应的16个字节。

其中字符串的意义可以在Jawin提供的文件instructions.h中找到,或者在官方文档(Jawin数据指令)中找到常用的一些指令字符串的意义。

2.传入参数的总字节大小。

3.前面写好的传入参数的原始字节流。

4.一个object数组。

5.ReturnFlags,用以根据C/C++返回值将C/C++的错误转换为Java的异常并抛出。其中CHECK_NONE表示不检查;CHECK_FALSE和CHECK_WIN32分别表示返回0是FALSE和SUCCESS,根据是否出错决定是否抛出异常;CHECK_HRESULT表示使用COM模型中的HRESULT作为返回值,其错误码可以配置。

使用Jawin的缺点:不方便调试,几乎所有的错误都抛出同样的异常COMException;需要对数据类型的转换比较了解;不能跨平台,对Windows的依赖性比较强。

使用Jawin的优点:方便使用,不用进行C/C++开发,不用对原始DLL进行封装就可以方便使用。

用 java调用dll的工具非常方便
  jawin.dll可以对dll中的方法进行调用,也可以调用com中的方法.
jawin主要是用来和COM打交道的.
  内部还提供了一个工具,直接对 com组件导出成 java的类,个人认为很方便.

Java调用Win API的事,回来查了下,SUN官方提供的JNI调用时还要自己生成头文件,对已有的DLL再次进行封装。需要对C++非常熟悉,因为要写C++代码。不过还好还有另一种解决方案——Jawin。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/shendaiming/archive/2009/11/12/4801828.aspx
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值