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());
    }
}


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值