特殊服务管理器配置
com.sun.star.container.XSet 接口允许在运行时将 com.sun.star.lang.XSingleServiceFactory 或 com.sun.star.lang.XSingleComponentFactory 实现插入到服务管理器或从中删除而不保存这些更改。办公软件应用程序终止时,所有更改都会丢失。插入的对象必须支持 com.sun.star.lang.XServiceInfo 接口。此接口返回的信息与组件工厂创建的组件实现的 XServiceInfo 接口相同。
使用此功能,可以连接正在运行的办公软件,将一个新工厂插入到服务管理器,还可以不必事先注册即实例化新服务。OpenOffice.org 不接受这种对已注册服务硬编码的方法,因为它必须在编译后扩展。
Java 应用程序可以在其各自使用 JNI(请参阅 专业 UNO - UNO 语言绑定 - Java 语言绑定)的进程中使用本机持久的服务管理器,或者在远程进程中使用。但是请注意,所有服务必须在此远程进程中进行实例化。
动态修改服务管理器
在纯 Java 中引导很简单,只需从 Bootstrap 类调用静态运行时方法 createInitialComponentContext()
。以下的小测试程序显示了如何在运行时将服务工厂插入服务管理器。示例使用了 编写 UNO 组件 - Java 中的简单组件 中的 Java 组件。完整的代码可以使用 JavaComp 示例组件查找。
示例说明了不论服务是插入到本地 Java 服务管理器还是远程办公软件服务管理器,都可以通过命令行参数进行控制。如果服务插入到办公软件服务管理器,则通过 OpenOffice.org Basic 访问服务。在这两种情况下,组件都可以在本地 Java 进程中运行。
如果服务插入办公软件服务管理器,则可以通过 OpenOffice.org Basic 调用 createUnoService("JavaTestComponentB")
实例化组件,只要 Java 进程未被终止。请注意,要通过以上说明的某种机制向办公软件进程添加新类型,请使用 uno.ini。
public static void insertIntoServiceManager( XMultiComponentFactory serviceManager, Object singleFactory) throws com.sun.star.uno.Exception { XSet set = (XSet ) UnoRuntime.queryInterface(XSet.class, serviceManager); set.insert(singleFactory); } public static void removeFromServiceManager( XMultiComponentFactory serviceManager, Object singleFactory) throws com.sun.star.uno.Exception { XSet set = (XSet) UnoRuntime.queryInterface( XSet.class, serviceManager); set.remove(singleFactory); } public static void main(String[] args) throws java.lang.Exception { if (args.length != 1) { System.out.println("usage: RunComponent local|uno-url"); System.exit(1); } XComponentContext xLocalComponentContext = Bootstrap.createInitialComponentContext(null); // initial serviceManager XMultiComponentFactory xLocalServiceManager = xLocalComponentContext.getServiceManager(); XMultiComponentFactory xUsedServiceManager = null; XComponentContext xUsedComponentContext = null; if (args[0].equals("local")) { xUsedServiceManager = xLocalServiceManager; xUsedComponentContext = xLocalComponentContext; System.out.println("Using local servicemanager"); // now the local servicemanager is used ! } else { // otherwise interpret the string as uno-url Object xUrlResolver = xLocalServiceManager.createInstanceWithContext( "com.sun.star.bridge.UnoUrlResolver", xLocalComponentContext); XUnoUrlResolver urlResolver = (XUnoUrlResolver) UnoRuntime.queryInterface( XUnoUrlResolver.class, xUrlResolver); Object initialObject = urlResolver.resolve(args[0]); xUsedServiceManager = (XmultiComponentFactory) UnoRuntime.queryInterface( XMultiComponentFactory.class, initialObject); System.out.println("Using remote servicemanager"); // now the remote servicemanager is used. } // retrieve the factory for the component implementation Object factory = TestServiceProvider.__getServiceFactory( "componentsamples.TestComponentB", null, null); // insert the factory into the servicemanager // from now on, the service can be instantiated ! insertIntoServiceManager( xUsedServiceManager, factory ); // Now instantiate one of the services via the servicemanager ! Object objTest= xUsedServiceManager.createInstanceWithContext( "JavaTestComponentB",xUsedComponentContext); // query for the service interface XSomethingB xs= (XSomethingB) UnoRuntime.queryInterface( XSomethingB.class, objTest); // and call the test method. String s= xs.methodOne("Hello World"); System.out.println(s); // wait until return is pressed System.out.println( "Press return to terminate" ); while (System.in.read() != 10); // remove it again from the servicemanager, otherwise we have // a dangling reference ( in case we use the remote service manager ) removeFromServiceManager( xUsedServiceManager, factory ); // quit, even when a remote bridge is running System.exit(0); }
从给定的注册表文件创建 ServiceManager
要从给定的注册表创建服务管理器,请使用包含类型库和组件注册信息的单个注册表。在程序中对注册表名称进行硬编码,并使用 cppuhelper 库中的 createRegistryServiceFactory()
函数。
#include <cppuhelper/servicefactory.hxx> using namespace com::sun::star::uno; using namespace com::sun::star::lang; using namespace rtl; using namespace cppu; int main( ) { // create the service manager on the registry test.rdb Reference< XMultiServiceFactory > rServiceManager = createRegistryServiceFactory( OUString::createFromAscii( "test.rdb" ) ); // instantiate a sample service with the service manager. Reference< XInterface > rInstance = rServiceManger->createInstance( OUString::createFromAscii("com.sun.star.bridge.UnoUrlResolver" ) ); // continue to connect to the office .... }
Content on this page is licensed under the Public Documentation License (PDL). |