• 沒有找到結果。

Chapter

取 ServiceManager 的组件上下文。 

// Query for the XPropertySet interface. 

// Note xOfficeServiceManager is the object retrieved by the  // UNO URL resolver 

XPropertySet xPropertySet = (XPropertySet) 

UnoRuntime.queryInterface(XPropertySet.class, xOfficeServiceManager); 

// Get the default context from the office server. 

Object oDefaultContext = xpropertysetMultiComponentFactory.getPropertyValue("DefaultContext"); 

// Query for the interface XComponentContext. 

xComponentContext = (XComponentContext) UnoRuntime.queryInterface( 

XComponentContext.class, objectDefaultContext); 

此解决方案允许使用同一服务管理器实例,不管此实例使用旧式 API 还是新式 API。将来,所 有 RedOffice  代码将仅使用新 API。但是,还将保留旧 API,目的是为了确保兼容性。

4.5 使用 UNO 接口

每个 UNO 对象都必须从接口 com.sun.star.uno.XInterface 继承。使用一个对象之前,需要了解 其使用方式以及生存期。通过将 XInterface 指定为每个 UNO 接口的基接口,UNO  为对象通信打 下了基础。由于历史原因,XInterface 的 UNOIDL  说明中列出了与 C++(或二进制  UNO)语言绑 定中与 XInterface  有关的功能;其他语言绑定根据不同的机制提供类似的功能: 

// module com::sun::star::uno  interface XInterface 

any queryInterface( [in] type aType ); 

[oneway] void acquire(); 

[oneway] void release(); 

}; 

acquire()和 release()方法通过引用计数来处理 UNO 对象的生存期。无论何时引用 UNO 对象,

所有当前语言绑定都内部处理 acquire()和 release()。 

queryInterface()方法获取该对象导出的其他接口。如果该对象支持类型参数指定的接口,调用 程序就会请求实现该对象。type 参数必须表示一个 UNO 接口类型。调用可能返回请求类型的接口 引用,或返回一个空 any。在 C++或 Java 中,只测试结果是否为 null。

当请求服务管理器创建一个服务实例时,我们无意中遇到了 Xinterface: 

XComponentContext xLocalContext = 

com.sun.star.comp.helper.Bootstrap.createInitialComponentContext(null); 

// initial serviceManager 

XMultiComponentFactory xLocalServiceManager = xLocalContext.getServiceManager(); 

// create a urlresolver

4 Chapter 

Object urlResolver    = xLocalServiceManager.createInstanceWithContext( 

"com.sun.star.bridge.UnoUrlResolver", xLocalContext); 

XmultiComponentFactory 的 IDL 规范显示: 

// module com::sun::star::lang 

上面的代码说明的是  createInstanceWithContext()提供给定服务的一个实例,但它仅返回一个  com.sun.star.uno.XInterface。然后,通过 Java UNO  绑定将其映射成 java.lang.Object。

要访问某项服务,需要知道该服务导出哪些接口,可从  IDL  引用中获得此信息。例如,对于  com.sun.star.bridge.UnoUrlResolver 服务,您会了解到: 

// module com::sun::star::bridge 

service UnoUrlResolver: XUnoUrlResolver; 

这意味着您在服务管理器上订购的服务必须支持  com.sun.star.bridge.XUnoUrlResolver。接下 来,查询此接口的返回对象: 

4

Chapter

一个实现多个接口的对象,而不是实现某个具体接口的对象。

然后,就可以查询在给定的旧式服务中指定的其他接口的返回对象,在这里,给定的旧式服务 为 com.sun.star.drawing.Text。 

UNO  有许多普通接口。例如,接口 com.sun.star.frame.XComponentLoader: 

// module com::sun::star::frame 

interface XComponentLoader: com::sun::star::uno::XInterface  { 

com::sun::star::lang::XComponent loadComponentFromURL( [in] string aURL,  [in] string aTargetFrameName, 

[in] long nSearchFlags, 

[in] sequence<com::sun::star::beans::PropertyValue> aArgs )  raises( com::sun::star::io::IOException, 

com::sun::star::lang::IllegalArgumentException ); 

4.6 属性

属性是属于某项服务的名称值对, 用于确定服务实例中某个对象的属性。属性通常用于非结构 属性,如对象的字体、大小或颜色,而 get 和 set 方法则用于像父对象或子对象这样的结构属性。

几乎在所有情况下,com.sun.star.beans.XPropertySet  都用于按名称访问的属性。其他接口,例 如 com.sun.star.beans.XPropertyAccess 或 com.sun.star.beans.XMultiPropertySet, 前者用于同时设置和 获取所有属性,后者用于同时访问多个指定属性。这对远程连接非常有用。另外,还有用于按数字  ID  访问属性的接口,如 com.sun.star.beans.XFastPropertySet。

图 13:属性

4 Chapter

相關文件