项目中涉及到与第三方系统对接,我们项目是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());
}
}