Jacob的簡單使用

                這幾天接到了一個項目,就是關於做中控指紋考勤機二次開發的,而中控的考勤機的dll是activex控件,所以使用jacob可以直接讀取。在用jacob時,在做new active object的時候,裏面傳的參數是中控考勤機dll註冊後的prog Id(zkemkeeper.ZKEM.1是在註冊表裏面找到的,在註冊裏面就搜索zkemsdk.dll就可以找到其progid了),不是classid。

                做這個項目時,要把中控的dll文件和jacob的jacob.dll拷到system32 下面 ,在做該項目時,要在工程中引入jacob.jar包.

下面介紹幾個class:

1. ActiveXComponent Class: 可以說將com封裝成一個組件。
2. Dispatch Class: 表示MS level dispatch object!相當於在windows上的資料結構。
3. Variant Class: 在java 與com中做互相通信的參數  

4. ComException Class: COM JNI 的錯誤處理。

幾個主要的函數:

1. call method: Dispatch class的函數!可用來呼叫COM/DLL的函數!它可以回傳結果(Variant variable)!
2. callSub method: 跟call函數類似!不過不回傳值!
3. get method: Dispatch class的函數!用來取得COM的屬性!
4. put method: Dispatch class的函數!用來設定COM的屬性!
5. invoke method: 等同於call函數!不過使用方式較複雜!
6. invokeSub method: 等同於callSub函數!不過使用方式較複雜!
7. getProperty method: ActiveXComponent class的函數!用來取得COM的屬性!
8. setProperty method: ActiveXComponent class的函數!用來設定COM的屬性!


通常要建立一個JACOB程式分成下面幾個步驟:

1. 構建ActiveX元件物件:
ActiveXComponent word = new ActiveXComponent("Word.Application");
其中的ActiveXComponent建構式內的值和你需要調用的ActiveX控制項有關!
一般常用的MS控制項

InternetExplorer: InternetExplorer.Application
Excel: Excel: Application
Word: Word.Application
Powerpoint: Powerpoint.Application
vb/java Script: ScriptControl
windows media Player: WMPlayer.OCX
Outlook: Outlook.Application
Visio: Visio.Application
DAO: DAO.PrivateDBEngine.35
MultiFace: MultiFace.Face

另外可用clsid建立! 如:  ActiveXComponent word = new ActiveXComponent("clsid:000209FF-0000-0000-C000-000000000046");

2. 設定或元件屬性:
如我要將word開啟後不隱藏!
word.setProperty("Visible", new Variant(true));//都是透過Variant來傳參數與COM溝通
Variant vs=Word.getProperty("Visible");

Dispatch class則透過了get與put
如:
Dispatch oDocuments = Word.getProperty("Documents").toDispatch();//透過toDispatch轉型
Variant v= Dispatch.get(oDocuments,"Parent");

3. 執行功能:
可以透過call! 也可以透過callN! 兩者不同點在於callN是以陣列方式傳參數!
Dispatch oDocument = Dispatch.call(oDocuments, "Open",  new Variant("C://atest.doc")).toDispatch();
Dispatch oDocument = Dispatch.callN(oDocuments, "Open", new Variant[]{ new Variant("C://atest.doc")}).toDispatch();

再用一個Dispatch的變數oDocument! 是為了之後能關閉close
Dispatch.call(oDocument, "Close", new Variant(false));
        
4. 關閉與回收資源
若有開啟檔案則要關閉與回收資源
if (Word != null) {
            Word.invoke("Quit", new Variant[] {new Variant(0)});
            Word = null;
            ComThread.Release();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章