特殊服务管理器配置

From Apache OpenOffice Wiki
Jump to: navigation, search


com.sun.star.container.XSet 接口允许在运行时将 com.sun.star.lang.XSingleServiceFactorycom.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 ....
  }
Documentation note.png 这将实例化老的样式服务管理器,而不会提供组件上下文。在以后的版本 (642) 中,您将可以使用其中的新服务管理器。
Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages