程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 用Java設計COM客戶

用Java設計COM客戶

編輯:關於JAVA

現在,讓我們轉到另一側,並用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錯誤,而不是檢查函數的返回值。
如欲深入了解這個包內包含的類,請參考微軟公司的產品文檔。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved