Zh/Uno/FAQ

From Apache OpenOffice Wiki
< Zh
Revision as of 04:01, 20 September 2007 by Zhangxiaofei (Talk | contribs)

Jump to: navigation, search

关于Uno, UDK, URE等相关的常见问题。基于在dev@udk.openoffice.org邮件列表中提出的问题与回答。如果您有任何评论或问题,在那里提出同样可以得到答复。

普遍问题

嘿,OpenOffice.org的组件技术真棒。我怎样才能参与进来?

好极了,我们永远欢迎您。关于帮助的切入点请参阅 开放任务列表。如果您对于其中的任何任务有任何疑问请不要犹豫提出来。把它发到dev@udk.openoffice.org.

UNO依赖于OpenOffice.org吗?

不久的将来,在OpenOffice.org的安装包之外将会有一个办公软件开发工具包(Office Development Kit)可供下载,这个开发工具包包含编译组件所需要的所有文件(头文件,库,工具软件,等等)。开发工具包也将包含示例。这些示例的makefile只需要有gnumake就可以编译(而不需要整个OpenOffice.org编译环境)。可以用这些makefile作为模板来把您的UNO组件集成到您的编译环境里。

UNO是不是和微软的COM技术类似?

是的,UNO可以看作完全独立于办公软件本身的组件模型。它与COM是直接的竞争关系,您可以在这里找到它所具有特性的列表。

什么是ODK?

办公软件开发工具包(ODK)在UDK的基础上增加了文档,API(更多IDL文件),以及示例。UDK是ODK的一个子集。如果您想要扩展OpenOffice.org的功能,或用OpenOffice.org制作解决方案,ODK将适合您的需要。UDK是一个独立的对象模型,可以脱离OpenOffice.org单独使用。在向Gnome以及XPCOM中集成,以达到统一开源对象模型(Open Source Object Model)的长期目标的过程中,UDK将是主要的讨论对象。未来,应该可以编写依赖于ODK的组件和独立于OpenOffice.org的组件。 办公软件开发工具包使软件工程师可以不需要笨重的OpenOffice.org编译环境就可以为OpenOffice.org开发组件。因此,ODK包含基本(以及重要的)库的二进制文件,C++头文件,所有的idl文件,.jar文件以及开发工具(代码生成器,组件注册工具,等等)。ODK还将包含一些源码与makefile,只要有gnumake和一个C++编译器就可以编译,您可以用这些makefile作为例子集成到您的编译环境里。未来,随每个版本的OpenOffice.org都会提供开发工具包并可以独立下载

你们为什么不用Java或CORBA做中间件?

我们需要的中间件可以用于细粒度组件,至少是进程内组件。在同一种语言中使用不同的UNO组件是不应当有开销的(例如,在C++中只是调用一个虚函数)。不幸的是,目前CORBA没有线程内组件的接口与结构的设计。唯一的通信方法是通过IIOP协议。对于进程内通信,这种开销实在太大。我们想要语言无关,让UNO作为像Java,C++,C和其它不同语言间的中介,这并不是CORBA的目标。UNO的另一个目标是成为像COM/DCOM,CORBA,Java和XPCOM这些不同对象模型间的中介,这也不是其它对象模型所具有的目标。

UNO和CORBA间有什么不同点?

UNO不生成桩代码(stub code)。在过去的UNO2实现中我们是生成的。那时的一个问题是,生成的桩代码非常大(尽管当时的API数据类型比现在还要少,大概也有12MB!)在UNO3(现在的版本)中,我们决定泛型地调用具体实现部分。给C++生成的,除去纯虚类只有用来返回数据类型的getCppuType()函数。完整的数据类型描述是在运行时从一个二进制仓库中读取的。在数据类型数量增加的情况下,这种方法具有空间开销小的优点。如果想了解UNO和CORBA间的更多不同点,请参考以下对比

UNO IDL和CORBA IDL间有什么不同点?

UNO IDL具有:

  • 结构(structure)与异常(exception)的继承关系
  • 一种新的服务(service)类型
  • 可以给枚举(enumeration)值赋具体的值
  • 没有数组(array)类型(但为此引入了序列(sequence))
  • 没有共用体(union)类型

我能把OpenOffice.org组件当作Java Beans使用吗?

可以,OpenOffice.org bean(OOoBean)项目使OpenOffice.org组件可以用于Java应用程序。请访问OOoBean以获得相关信息、源码、以及二进制档的下载。 OOo Bean具有一下特点:

  • 将OpenOffice.org组件嵌入Java应用程序(application)或(applet)中。
  • 可以通过Java访问全部StarOffice API,来编写您自己的应用程序。

这个项目刚刚开始,因此请留意可能存在的bug、不完整的文档以及安装问题等等。我们欢迎每位对OpenOffice.org和Java感兴趣的人士参与到项目中来,或是在他们的应用程序中使用OOoBean。

开发相关问题

能给我些代码示例吗?

C++示例

位置 内容
udk/remotebridges/examples/officeclient.cxx 这个示例说明了如何建立到OpenOffice.org文档的线程间桥接。

无论您的组件是用于Windows还是Linux,编写上都不存在区别。

udk/product/examples/ 更多示例。

HTML 文档

位置 内容
http://udk.openoffice.org/cpp/man/tutorial/remotedemo.html 远程通信demo教程。
http://udk.openoffice.org/cpp/man/component_tutorial.html 在UNO空间中编写的组件。
http://udk.openoffice.org/cpp/man/tutorial/unointro.html C++ UNO指南。
http://udk.openoffice.org/common/man/concept/unointro.html 编程语言无关的UNo指南。

Java示例

我们缺少一篇优秀的关于如何在Java下开始开发的文档。您可以直接查看源码。在jurt项目中也有一些示例,您可以使用以下命令下载:

$ cvs -d :pserver:anoncvs@anoncvs.services.openoffice.org:/cvs co udk/jurt

您可以在demo目录下的源码中找到一些示例。

位置 内容
jurt/demo/com/sun/star/demo/TestOffice.java 启动一个线程间桥接并在office中新建几个文档。
jurt/demo/com/sun/star/comp/demo/ 这里可以找到一些关于如何创建一个Java组件的样例代码。这个样例可以注册到一个office中并在这个office中运行。

我们还建议参考sun开发者网络(http://developers.sun.com/),您可以点击Download SDK下载到StarOffice程序员教程。它包含了一些关于某些API问题的示例。关于office API更深入的问题的问题请通过dev@api.openoffice.org询问。

如何生成C++数据类型定义?

  1. 新建用来描述接口的.idl文件
  2. 使用unoidl生成.urd文件
  3. 使用regmerge将新数据类型合并到系统注册表中
  4. 使用cppumaker生成C++数据类型(在Java中使用javamaker)
  5. 在Java中,编译生成的接口,将它们添加到您的CLASSPATH中

regcomp是干什么用的?

unoild将IDL描述转换成一个二进制库的格式,每个IDL数据类型在运行时都需要这个数据类型信息。unoidl生成的输出文件只包含定义的数据类型的信息。它不包含所有数据类型的全部数据类型描述。因此,需要使用regmerge将新数据类型安装到类型库applicat.rdb中。如果某人开发一个UNO组件,他必须支持或输出一些管理用的函数(例如,component_writeInfo)。关于支持哪些服务以及实现的名称,开发者要在component_writeInfo函数里给出相关信息。之后服务管理器(service manager)将使用这些信息来生成组件的实例。因此,如果您开发您自己的组件,您必须将您的组件安装到运行时中去。用regcomp就可以做到这点。regcomp读取component_writeinfo函数,并利用这些信息进行一些管理工作。例如,这个组件支持的所有服务都将插入一个全局的SERVICES段中,这个段要被服务管理器用到。在这个段中建立了服务名与实现名的相互联系。在IMPLEMENTATIONS保留区中,您可以为您的组件找到一个正确的段,它的值等于在component_writeInfo函数中定义的键值。请查看一下您安装在office目录下的applicat.rdb。

$ regview applicat.rdb /SERVICES
$ regview applicat.rdb /SERVICES/<service_name>
$ regview applicat.rdb /IMPLEMENTATIONS
$ regview applicat.rdb /IMPLEMENTATIONS/<implementation_name> 

因此,安装一个新组件的时候需要使用regcomp。在类型库中安装新数据类型的时候需要使用regmerge。

哪里能找到OpenOffice.org API?

请访问API项目网站

如何测试我自己的组件?

如果您开发了一个新组件,最后会生成一个共享的动态链接库(DLL)。当接到请求使用您实现的服务时,将会载入这个DLL。为了让您的组件在OpenOffice.org中能够看到和使用到,需要把您的服务注册成一个外部组件。您需要按照下面步骤来做到这一点:

  1. 将您的DLL拷贝到.../program目录下。
  2. 将regcomp工具拷贝到.../program目录下。您可以在UDK的cpputools模块中找到这个工具。
  3. 使用regcomp工具:
    $ regcomp -register -r applicat.rdb -c foo.dll
  4. 如果您开发了自己的接口或数据类型,您需要将这些新数据类型注册到UNO类型库中。您需要UDK的registry模块中的regmerge工具来做到这点。unoidl工具会生成一个foo.urd文件,它包含了新数据类型。可以在您的组件的输出目录下找到这个文件。
  5. 使用regmerge工具:
    $ regmerge applicat.rdb /UCR foo.urd
    IDL数据类型中的所有数据类型定义都存放在保留键值UCR下面(UNO core reflection,UNO核心映射)
  6. 组件与新数据类型注册后您就可以通过服务管理器为您的服务生成实例了。

使用basic,有一种既快又便捷的方法可以给一个新服务生成实例。新建一个basic脚本输入下面的代码:

Sub Main
  s = createUnoService("YourSerivceName")
  msgbox(s.dbg_supportedinterfaces)
End Sub

如果实例化过程成功,对话框将显示对象支持的全部接口。 可以在这个目录下的README文件中找到更多信息http://www.openoffice.org/source/browse/udk/product/examples/

文档相关问题

Personal tools