独立使用实例
From Apache OpenOffice Wiki
< Zh | Documentation
只键入 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()
调用传送到组件。
![]() |
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 目录应为当前目录,并且 regcomp 和 uno 工具必须已复制到此目录中。
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). |