項目中涉及到與第三方系統對接,我們項目是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());
}
}