天天看點

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

    }

}