初次接触
入门
从 OpenOffice.org 2.0 开始,要获得提供 UNO 功能和办公软件功能的透明使用工作环境是非常简单的。以下向您展示如何编写一个可初始化 UNO 的小程序,这意味着,它可以内部连接到一个办公软
件,或开始一个新的办公软件进程(如有必要),并告诉您它是否曾获得提供办公软件服务管理器对象的办公软件组件上下文。启动 Java IDE 或源编辑器,然后输入 FirstUnoContact
类的以下源代码。
要在 NetBeans IDE 中创建和运行该类,请执行以下步骤:
- From the File menu, select New Project. 从文件菜单,选择新建项目,在类别中选择 OpenOffice.org 并选择 OpenOffice.org 客户端应用程序。在下一步向导面板中输入FirstUnoContact作为项目名称,或者更改一下项目包和/或项目路径。按确定按钮创建新项目。
- 通过项目浏览器 -> FirstUnoContact项目 -> 源包或 Source Packages -> ... 找到 FirstUnoContect.java 骨架程序。
- 输入以下显示的源代码 (FirstSteps/FirstUnoContact.java)
- 按 F11 生成项目后再按 F6 运行
示例 FirstUnoContact :
public class FirstUnoContact { ... public static void main(String[] args) { try { // get the remote office component context com.sun.star.uno.XComponentContext xContext = com.sun.star.comp.helper.Bootstrap.bootstrap(); System.out.println("Connected to a running office ..."); com.sun.star.lang.XMultiComponentFactory xMCF = xContext.getServiceManager(); String available = (xMCF != null ? "available" : "not available"); System.out.println( "remote ServiceManager is " + available ); } catch (java.lang.Exception e){ e.printStackTrace(); } finally { System.exit(0); } } }
虽然 NetBeans 的 OpenOffice.org 客户端应用程序 向导可以配置一个可工作的项目环境,但是为其他IDE配置也不是很困难,或者直接运行一个 ant 脚本。
示例:ant 生成脚本 (FirstSteps/build_FirstUnoContact.xml):
<?xml version="1.0" encoding="UTF-8"?> <project basedir="." default="all" name="FirstUnoContact"> <property name="OFFICE_HOME" value="c:/OpenOffice.org"/> <property name="OO_SDK_HOME" value="c:/OpenOffice.org_SDK"/> <target name="init"> <property name="OUTDIR" value="${OO_SDK_HOME}/WINExample.out/class/FirstUnoContact"/> </target> <path id="office.class.path"> <filelist dir="${OFFICE_HOME}/program/classes" files="jurt.jar,unoil.jar,ridl.jar,juh.jar"/> </path> <fileset id="bootstrap.glue.code" dir="${OO_SDK_HOME}/classes"> <patternset> <include name="com/sun/star/lib/loader/*.class"/> <include name="win/unowinreg.dll"/> </patternset> </fileset> <target name="compile" depends="init"> <mkdir dir="${OUTDIR}"/> <javac debug="true" deprecation="true" destdir="${OUTDIR}" srcdir="."> <classpath refid="office.class.path"/> </javac> </target> <target name="jar" depends="init,compile"> <jar basedir="${OUTDIR}" compress="true" jarfile="${OUTDIR}/FirstUnoContact.jar"> <exclude name="**/*.java"/> <exclude name="*.jar"/> <fileset refid="bootstrap.glue.code"/> <manifest> <attribute name="Main-Class" value="com.sun.star.lib.loader.Loader"/> <section name="com/sun/star/lib/loader/Loader.class"> <attribute name="Application-Class" value="FirstUnoContact"/> </section> </manifest> </jar> </target> <target name="all" description="Build everything." depends="init,compile,jar"> <echo message="Application built. FirstUnoContact!"/> </target> <target name="run" description="Try running it." depends="init,all"> <java jar="${OUTDIR}/FirstUnoContact.jar" failonerror="true" fork="true"> </java> </target> <target name="clean" description="Clean all build products." depends="init"> <delete> <fileset dir="${OUTDIR}"> <include name="**/*.class"/> </fileset> </delete> <delete file="${OUTDIR}/FirstUnoContact.jar"/> </target> </project>
有关使用 C++ 连接到办公软件的示例,请参阅 专业 UNO - UNO 语言绑定 - C++ 语言绑定 一章。有关使用 OpenOffice.org Basic 访问办公软件的详细信息,请参阅 OpenOffice.org Basic 和对话框 - OpenOffice.org Basic 入门。
下一节介绍 Java 程序与 OpenOffice.org连接期间所发生的情况
服务管理器
UNO 引入了服务管理器的概念。服务管理器可以被视为创建服务的工厂。现在,只需将服务看 作可用于执行特定任务的 UNO 对象即可。稍后我们将更精确地定义术语服务。 例如,可以使用以下服务:
com.sun.star.frame.Desktop
- 维护加载的文档:用于加载文档,获得当前文档以及访问所有加载的文档
com.sun.star.configuration.ConfigurationProvider
- 生成对 OpenOffice.org 配置(例如工具 – 选项对话框中的设置)的访问权限
com.sun.star.sdb.DatabaseContext
- 维护与 OpenOffice.org 一起注册的数据库
com.sun.star.system.SystemShellExecute
- 在当前平台上执行为应用程序注册的系统命令或文档
com.sun.star.text.GlobalSettings
- 管理文本文档的全局视图和打印设置
服务始终存在于组件上下文(Component context)中。组件上下文(Component context)包括创建了服务以及服务使用的其他数据的服务管理器。
上述 FirstUnoContact
类被视为 OpenOffice.org 进程的客户机,而此时的
OpenOffice.org 是服务器。该服务器有自己的组件上下文和服务管理器,可从客户机程序进行访问以使用
办公软件功能。该客户机程序初始化 UNO,并从 OpenOffice.org 进程获得组件上下文。在内部,此初始
化进程创建一个本地服务管理器,建立与一个正在运行的
OpenOffice.org 进程的管道连接(如有必要,则启动一个新进程)并返回远程组件上下文。在第一步,这
是您必须知道的唯一一件事。com.sun.star.comp.helper.Bootstrap.bootstrap()
方法初始化 UNO,
并返回一个正在运行的 StarSuite 进程的远程组件上下文。有关引导 UNO、不同连接类型的实现机
会以及如何建立与 UNO 服务器进程的连接,请参阅 专业 UNO - UNO 概念。
第一个初始化步骤完成后,您可以使用组件上下文(Component context)的方法 getServiceManager() 获得
OpenOffice.org 进程的远程服务管理器,这就使您可以通过 API 访问可用的完整办公软件功能。
失败的连接
在某些条件下远程连接可能会失败:
- 客户机程序应该能够检测到错误。例如,有时网桥可能不可用。这时,连接到办公软件并执行了某项任务且随后又退出的简单客户机应该停止其工作并通知用户是否出现了错误。
- 长期运行的客户机不应认为对初始对象的引用在客户机的整个运行期间都有效。即使连接由于某种原因断开,稍后又恢复,客户机也应该重新开始运行。当连接失败时,长时间运行的可靠客户机应停止当前工作,通知用户连接不可用并释放对远程进程的引用。当用户尝试重复上一次操作时,客户机应尝试重建连接。如果连接只是暂时不可用,则不要强制用户重新启动程序。
如果网桥不可用,并且尝试了访问,将抛出 DisposedException。在程序中访问远程引用时,始终通过将远程引用设置为空并相应地通知用户的方式来捕捉此异常。如果客户机设计为运行更长时间,则准备好在发现远程引用当前为空时获得新的远程引用。
处理丢失连接的一个更复杂的方式为针对于底层桥对象注册一个侦听者。专业 UNO - UNO 概 念 - UNO 进程间连接 一章中介绍了如何编写连接识别客户机。
Content on this page is licensed under the Public Documentation License (PDL). |