独立使用实例

From Apache OpenOffice Wiki
Jump to: navigation, search


只键入 UNO,屏幕上就会显示以下用法:

 uno (-c ComponentImplementationName -l LocationUrl | -s ServiceName) 
    [-ro ReadOnlyRegistry1] [-ro ReadOnlyRegistry2] ... [-rw ReadWriteRegistry] 
 [-u uno:(socket[,host=HostName][,port=nnn]|pipe[,name=PipeName]);urp;Name [--singleaccept] [--singleinstance]] 
 [-- Argument1 Argument2 ...]


选择要实例化的实现

使用选项 -s servicename,将给定要实例化的服务的名称。UNO 可执行文件将尝试用此名称实例化服务,使用如下所列的注册表。
另外,还可以使用 -l 和 -c 选项。-l 将给定共享库或 .jar 文件位置的 URL,-c 选项则给定组件中所需服务实现的名称。请记住,组件可以包含多个实现。

选择用于组件上下文的注册表(可选)

使用选项 -ro 将给定包含组件的注册信息和/或类型库的注册表文件的 URL。-ro 选项可以多次给定。-rw 选项只能给定一次,并且必须是具有读取/写入权限的注册表的名称。当实例化的组件尝试在运行时注册组件时将会使用此选项。此选项很少用到。
请注意,UNO 工具将忽略引导变量,例如 UNO_TYPES 和 UNO_SERVICES。

UNO URL(可选)

给定 UNO URL 将导致 UNO 工具在服务器模式下启动,然后接受 UNO URL 的连接部分。如果另一个进程连接到资源(TCP/IP 套接字或命名管道),将在连接顶端建立 UNO 进程间桥(请参阅 专业 UNO - UNO 概念 - UNO 进程间连接)。请注意,urp 应该始终用作协议。当客户端使用在 UNO URL 最后一部分给定的名称请求已命名对象时,组件的实例将被实例化。

选项 --singleaccept

只有给定 UNO URL 时才有意义。它将告知 uno 可执行文件只接受一个连接,以此阻塞其他的连接尝试。

选项 --singleinstance

只有给定 UNO URL 时才有意义。它将告知 UNO 可执行文件始终返回组件的同一个(第一个)实例,因此多个进程将与实现的同一实例通信。如果没有给定此选项,com.sun.star.bridge.XBridge 接口的每一 getInstance() 调用都将实例化新对象。

选项 -- (双短线)

-- 后面的所有内容都被解释为用于组件本身的选项。参数通过 com.sun.star.lang.XInitialization 接口的 initialize() 调用传送到组件。
Documentation note.png UNO 可执行文件当前不支持 专业 UNO - UNO 语言绑定 - C++ 语言绑定 中介绍的引导变量概念。UNO 注册表必须通过命令行显式给定。


以下示例显示了如何实现适用于 UNO 可执行文件的 Java 组件。

  import com.sun.star.uno.XComponentContext;
  import com.sun.star.comp.loader.FactoryHelper;
  import com.sun.star.lang.XSingleServiceFactory;
  import com.sun.star.lang.XMultiServiceFactory;
  import com.sun.star.registry.XRegistryKey;
 
  public class UnoExeMain implements com.sun.star.lang.XMain
  {
      final static String __serviceName = "MyMain";
      XComponentContext _ctx;
 
      public UnoExeMain( XComponentContext ctx )
      {
          // in case we would need the component context !
          _ctx = ctx;
      }
 
      public int run( /*IN*/String[] aArguments )
      {
          System.out.println( "Hello world !" );
          return 0;
      }
 
      public static XSingleServiceFactory __getServiceFactory(
          String implName, XMultiServiceFactory multiFactory, XRegistryKey regKey)
      {
          XSingleServiceFactory xSingleServiceFactory = null;
 
          if (implName.equals(UnoExeMain.class.getName()))
          {
              xSingleServiceFactory =
                  FactoryHelper.getServiceFactory(
                      UnoExeMain.class, UnoExeMain.__serviceName, multiFactory, regKey);
          }
          return xSingleServiceFactory;
      }
 
      public static boolean __writeRegistryServiceInfo(XRegistryKey regKey)
      {
          boolean b = FactoryHelper.writeRegistryServiceInfo(
              UnoExeMain.class.getName(),
              UnoExeMain.__serviceName, regKey);
          return b;
      }
  }


类本身从 com.sun.star.lang.XMain 继承。它使用 com.sun.star.uno.XComponentContext 接口实现构造函数,并存储组件上下文以备将来使用。在其 run() 方法中,将打印 'Hello World'。最后两个强制性的函数负责实例化组件并将组件信息写入注册表。如果需要更多信息,请参阅 编写 UNO 组件 - Java 中的简单组件


代码需要被编译并放入 .jar 文件,该文件具有一个相应的标明文件:

 RegistrationClassName: UnoExeMain


这些命令创建 jar:

 javac UnoExeMain
 jar -cvfm UnoExeMain.jar Manifest UnoExeMain.class


要使用它,请使用以下命令行将其注册到单独的注册表文件(此处是 test.rdb)。<OfficePath>/program 目录应为当前目录,并且 regcompuno 工具必须已复制到此目录中。

 regcomp -register \ 
         -br <officepath>/program/services.rdb \ 
         -r test.rdb \ 
         -c file:///c:/devmanual/Develop/samples/unoexe/UnoExeMain.jar \ 
         -l com.sun.star.loader.Java2


\ 表示命令行继续。


组件现在可以运行:

 uno -s MyMain -ro types.rdb -ro services.rdb -ro test.rdb 


此命令应给定输出 "hello world !"

Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages