天天看点

java通过jacob实现对com组件的调用

项目中涉及到与第三方系统对接,我们项目是java的,对方项目提供的接口是c#的,根据网上的一些信息我们可以知道java调用com组件有一套解决方案那就是jni,另外还有一个开源的jar包,对jni的封装----jacob,实现机制类似于java的反射,调用起来方便。

对于jacob的使用可以参考以下两个网址的内容,比较通俗易懂,官网下载的jar中也包含其api

http://www.ibm.com/developerworks/cn/java/j-lo-jacob/

http://sourceforge.net/projects/jacob-project/

对于com组件首先需要了解一个概念

  COM 参数有in, out ,retval.其主要作用:

  In 输入参数,它的值不被返回  

  Out 输出参数,必须是一个成员指针,将返回结果 

  RetVal 返回值,返回的值不能显示到用户向导中

[in]类型表明参数是一个输入参数,所以这个参数不会向外界返回结果

[out]类型表明参数是个输出参数,所以这个参数会向外界返回结果,而且传入参数时,可以将变量设置为NULL

[out,retval]类型表明参数是个输出参数,且会返回类中数据成员的值

[out,retval]这类参数会比较特别,用个不太准确的说话解释下就是如果方法的有这么一个参数,那么这个方法不尽可以反馈返回值,还可以通过此参数返回“另一个返回值”

废话不多少了,上代码大家看吧

com组件接口说明

HRESULT GetHttpOP([out, retval] LPDISPATCH* pOut)

功能: 获取Http通讯接口对象IHttpOP

HRESULT Login([in] BSTR bstrUrl, [in] BSTRbstrUser, [in] BSTR bstrPwd,

 [out,retval] BOOL* bRet)

功能: 登陆

参数:

    bstrUrl     [in]    服务器URL

    bstrUser    [in]    用户标识

    bstrPwd     [in]    密码

返回值:

    bRet    TRUE:成功, FALSE:失败

HRESULT SendData([in] BSTR bstrData, [out,retval] BOOL* bRet)

功能: 发送数据包

参数:

    bstrData        [in]    数据

返回值:

    bRet    TRUE:成功, FALSE:失败

HRESULT RecvData([out] BSTR* pData, [out,retval] BOOL* bRet )

功能: 接收数据包

参数:

    pData   [out]   收到的数据

返回值:

    bRet    TRUE:成功, FALSE:失败

java代码

public class InterfaceTest {

    private static ActiveXComponent dotnetCom = null;

    private static Variant va = null;

    private static Dispatch dis = null;

    public static void main(String[] args) {

        //ShineHttp.Main为com组件入口主方法

        dotnetCom = new ActiveXComponent("ShineHttp.Main");

        //获取通信对象

        dis = Dispatch.call(dotnetCom, "GetHttpOP").toDispatch();

        System.out.println("获取Http通讯接口对象成功。");

        //调用通讯对象登陆方法

        va = Dispatch.call(dis, "Login", "url", "user", "pwd");

        System.out.println(va.toBoolean());

        //调用通讯对象发送数据方法

        va = Dispatch.call(dis, "SendData", new Variant("报文内容"));

        System.out.println("SendData" + "结束!");

        //调用通讯对象接收数据方法,注意第三个参数

        Variant v1 = new Variant("",true);

        va = Dispatch.call(dis, "RecvData", v1);

        System.out.println("对方系统返回的数据包为:" + v1.toString() + "++++" + va.toBoolean());

    }

}