用Java設計COM客戶

來源:互聯網
上載者:User

現在,讓我們轉到另一側,並用Java開發一個COM客戶。這個程式會調用系統已安裝的COM伺服器內的服務。就目前這個例子來說,我們使用的是在前一個例子裡為伺服器實現的一個客戶。儘管代碼在Java程式員的眼中看起來比較熟悉,但在幕後發生的一切卻並不尋常。本例使用了用Java寫成的一個伺服器,但它可應用於系統內安裝的任何ActiveX控制項、ActiveX Automation伺服器或者ActiveX組件——只要我們有一個類型庫。
首先,我們將Jactivex工具應用於伺服器的類型庫。Jactivex有一系列選項和開關可供選擇。但它最基本的形式是讀取一個類型庫,並產生Java源檔案。這個源檔案儲存於我們的windows/java/trustlib目錄中。通過下面這行代碼,它應用於為外部COM Automation伺服器產生的類型庫:

jactivex /javatlb JavaAdder.tlb

Jactivex完成以後,我們再來看看自己的windows/java/trustlib目錄。此時可在其中看到一個新的子目錄,名為javaadder。這個目錄包含了用於新包的源檔案。這是在Java裡與類型庫的功能差不多的一個庫。這些檔案需要使用Microsoft編譯器的專用引導命令:@com。jactivex產生多個檔案的原因是COM使用多個實體來描述一個COM伺服器(另一個原因是我沒有對MIDL檔案和Java/COM工具的使用進行細緻的調整)。
名為Adder.java的檔案等價於MIDL檔案中的一個coclass引導命令:它是對一個COM類的聲明。其他檔案則是由伺服器揭示出來的COM介面的Java等價物。這些介面(比如Adder_DispatchDefault.java)都屬於“遣送”(Dispatch)介面,屬於Automation控制器與Automation伺服器之間的溝通機制的一部分。Java/COM整合特性也支援雙介面的實現與使用。但是,IDispatch和雙介面的問題已超出了本附錄的範圍。
在下面,大家可看到對應的客戶代碼。第一行只是匯入由jactivex產生的包。然後建立並使用COM Automation伺服器的一個執行個體,就象它是一個原始的Java類那樣。請注意行內的類型模型,其中“例示”了COM對象(即產生並調用它的一個執行個體)。這與COM物件模型是一致的。在COM中,程式員永遠不會得到對整個對象的一個引用。相反,他們只能擁有對類內實現的一個或多個介面的引用。
“例示”Adder類的一個Java對象以後,就相當於指示COM啟用伺服器,並建立這個COM對象的一個執行個體。但我們隨後必須指定自己想使用哪個介面,在由伺服器實現的介面中挑選一個。這正是類型模型完成的工作。這兒使用的是“預設遣送”介面,它是Automation控制器用於同一個Automation伺服器通訊的標準介面。欲瞭解這方面的細節,請參考由Ibid編著的《Inside COM》。請注意啟用伺服器並選擇一個COM介面是多麼容易!
 

import javaadder.*;public class JavaClient {  public static void main(String [] args) {    Adder_DispatchDefault iAdder =         (Adder_DispatchDefault) new Adder();    iAdder.setAddend(3);    iAdder.sum();    iAdder.sum();    iAdder.sum();    System.out.println(iAdder.getResult());  }}

現在,我們可以編譯它,並開始運行程式。

1. com.ms.com包
com.ms.com包為COM的開發定義了數量眾多的類。它支援GUID的使用——Variant(變體)和SafeArray Automation(安全陣列自動)類型——能與ActiveX控制項在一個較深的層次打交道,並可控制COM異常。
由於篇幅有限,這裡不可能涉及所有這些主題。但我想著重強調一下COM異常的問題。根據規範,幾乎所有COM函數都會返回一個HRESULT值,它告訴我們函數調用是否成功,以及失敗的原因。但若觀察伺服器和客戶代碼中的Java方法簽名,就會發現沒有HRESULT。相反,我們用函數傳回值從一些函數那裡取回資料。“虛擬機器”(VM)會將Java風格的函數調用轉換成COM風格的函數調用,甚至包括返回參數。但假若我們在伺服器裡調用的一個函數在COM這一級失敗,又會在虛擬機器裡出現什麼事情呢?在這種情況下,JVM會認為HRESULT值標誌著一次失敗,並會產生類com.ms.com.ComFailException的一個固有Java異常。這樣一來,我們就可用Java異常控制機制來管理COM錯誤,而不是檢查函數的傳回值。
如欲深入瞭解這個包內包含的類,請參考微軟公司的產品文檔。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.