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