免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4279 | 回复: 0

java调用vc dll、vb dll(Com 组件) [复制链接]

论坛徽章:
0
发表于 2009-12-04 18:26 |显示全部楼层
**********************************************
** 文章名称:java调用vc dll、vb dll(Com 组件)
** 版权信息:可以任意转载,但要注明出处及作者信息
** 作   者: 隗公万
** 时   间: 2009.12.04
** 联系方式:weigongwan@gmail.com
***********************************************/
一、简单说明
   java调用动态库其实都是需要通过一些辅助的组件,java调用vc的动态库一般是用JNI,而java调用vb的动态库更确切的说是调用vb的Com组件则是用的jacob了。本人也是班门弄斧,想鄙视我的就鄙视吧,呵呵
二、java调用vc动态库
   1、首先,写出java的调用程序,例子代码如下(javacall.java):
               
               
                public class javacall
{
    static
    {
        System.loadLibrary("calldll");
    }
    public native static int callcount(int i);
    public static void main(String[] args)
    {
        javacall jc=new javacall();
        int j;
        j=jc.callcount(10);
        System.out.println(j);
    }
};
    2、利用javacall.java文件生成javacall.class文件和javacall.h头文件。
D:\AdamSoft\batool-g\java_call_dll_for_example>javac javacall.java
D:\AdamSoft\batool-g\java_call_dll_for_example>javah javacall
D:\AdamSoft\batool-g\java_call_dll_for_example>
    3、下面利用生成好的头文件来创建vc的动态库,直接在visual studio上面新建一个Win32 Application Wizard文件,Application type选择DLL,然后点击完成即可,source如下:
// calldll.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "javacall.h"
BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}
JNIEXPORT jint JNICALL Java_javacall_callcount(JNIEnv *, jclass, jint p)
{
   
    int j = p * p;
    return j;
}
这时候要将javacall.h头文件拷贝到工程目录中,还有就是需要把jni.h和jni_md.h头文件拷贝到工程目录中。jni.h和jni_md.h头文件都在jdk的include目录里面。最重要的一点是如果是拷贝过来的话,那么javacall.h的头文件中就要将引用头文件的地方#include 改成#include "jni.h",这样就会在本地的工程目录中检索头文件了。最后编译下就编译出来了calldll.dll动态库了。将这个动态库拷贝到javacall.class所在的目录中。
    4、最后到控制台下面执行下javacall.class看看是不是能计算出10的平方来。
D:\AdamSoft\batool-g\java_call_dll_for_example>java javacall
100
D:\AdamSoft\batool-g\java_call_dll_for_example>
到此java调用vc动态库就算是成功了。
注:贴一个java的环境配置的脚本文件env.bat,内容如下:
color 0a
cd /D D:\AdamSoft\batool-g\java_call_dll_for_example
set JAVA_HOME=D:\Program Files\Java\jdk1.5.0_17
set PATH=%JAVA_HOME%\bin;%PATH%
set CLASSPATH=.;%JAVA_HOME%\lib\tools.jar
cmd.exe
三、java调用vb动态库(com 组件)
    1、首先需要准备jacob.jar和jacob.dll两个文件,我这里是1.7版本的,直接在网上搜索下就能找到下载地址了,我这里就不提供了。
    2、我们先来将java程序创建出来,我这里创建的名字是javacallvb.java,内容如下:
import com.jacob.com.*;
import com.jacob.activeX.*;
public class javacallvb
{
    public static String ShowMsg(String str){
        String res="";
        
        try {
            ActiveXComponent pp = new ActiveXComponent("DLLProject.VBDLL");
            Dispatch myCom = (Dispatch) pp.getObject();
            Variant result = Dispatch.call( myCom, "vbShowMsg", str) ;
            res=result.toString();
        }catch (Exception e) {
            res="";
            e.printStackTrace();
        }
        return res;
    }
    public static void main(String[] args)
    {
        javacallvb jcv=new javacallvb();
        String strRet = jcv.ShowMsg("welcome weigongwan!");
        System.out.println(strRet);
    }
}
我这里是调用DLLProject库中的VBDLL类里面的vbShowMsg函数,先向里面传递一个参数,然后接收返回来的值,最后打印在控制台上。
    3、现在开始创建vb的动态库,更确切的说是现在开始创建vb的Activex dll组件。这里需要注意的是visual studio里面创建出来的Class Library并不是vb中的动态库而是vb.net的库,我们需要用microsoft Visual Basic软件来编译Activex dll库。打开软件后点击ActiveX DLL,在工程窗口中点击Class1(Class1),然后在属性里面将名字改成VBDLL。再点击工程1(工程1)将里面的名字改成DLLProject。这时候我们回过头来在VBDLL的文件里面输入进去我们想要实现的函数,我这里的函数内容如下:
Public Function vbShowMsg(ByVal str As String) As String
    MsgBox str
    vbShowMsg = "VB:" + str
End Function
Public Function vbCount(ByVal i As Integer) As Integer
    vbCount = i * i
End Function
最后,将程序保存,在点击菜单的文件->生成DLLProject.dll(K)...,将动态库生成到javacallvb.java程序所在的目录中。
    4、开始准备编译javacallvb.java程序,我们首先要确保当前目录中有文件DLLProject.dll,DLLProject.exp、DLLProject.lib、jacob.dll、jacob.jar、javacallvb.java。确认这些文件都已经存在了,我们打开控制台,我这里的是些的脚本env.bat,直接双击就可以了。运行执行效果如下:
D:\AdamSoft\batool-g\java_call_dll_for_example>javac -classpath
jacob.jar javacallvb.java
D:\AdamSoft\batool-g\java_call_dll_for_example>java -cp jacob.jar;. javacallvb
VB:welcome weigongwan!
D:\AdamSoft\batool-g\java_call_dll_for_example>
到此,我们的java调用vb动态库就算是成功了。
四、java调用vc动态库,再由vc动态库调用vb动态库
    1、首先,创建java程序,我这里的就是javacall.java,内容如下:
public class javacall
{
    static
    {
        System.loadLibrary("calldll");
    }
    public native static int callcount(int i);
    public static void main(String[] args)
    {
        javacall jc=new javacall();
        int j;
        j=jc.callcount(10);
        System.out.println(j);
    }
};
这个文件一看就知道是java调用vc动态库的,关于java调用vc动态库的我就不多说了,因为最开始已经介绍过了。
    2、vb动态库也不多说了,我这里就是用DLLProject.dll动态库。
    3、vc动态库里面的内容我直接贴出来如下:
// calldll.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "javacall.h"
#include stdio.h>
// 这里是引用vb的动态库,需要用全路径
#import "D:\AdamSoft\batool-g\java_call_dll_for_example\DLLProject.dll" no_namespace
BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                     )
{
    return TRUE;
}
short CallFun(short i)
{
    short sRet = 0;
    BSTR bstrDesc;
    try
    {
      CoInitialize(NULL);
      _VBDLLPtr ptr;
      ptr.CreateInstance(__uuidof(VBDLL));
      sRet = ptr->vbCount(i);
    } catch(_com_error e)
    {
        bstrDesc = e.Description();
    }
    CoUninitialize();
    return sRet;
}
JNIEXPORT jint JNICALL Java_javacall_callcount(JNIEnv *, jclass, jint p)
{
   
    int j = (int)CallFun(p);
    return j;
}
以上文件就是vc动态库中的内容。
    4、最后,将vb动态库、vc动态库以及javacall.java程序放到同意目录中。执行效果如下:
D:\AdamSoft\batool-g\java_call_dll_for_example>javac javacall.java
D:\AdamSoft\batool-g\java_call_dll_for_example>java javacall
100
D:\AdamSoft\batool-g\java_call_dll_for_example>
调用成功,显示出来了10的平方了。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/31179/showart_2111474.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP