编译和测试 C++ 组件

From Apache OpenOffice Wiki
Jump to: navigation, search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.


编译过程

如果需要更多有关编译组件代码的信息,请参阅 GUN makefile 文件。它使用了许多 SDK 中的平台相关的变量,这些变量包括在 <SDK>/settings/settings.mk 中。为简单起见,此处省略具体内容,只概要介绍建立过程的八个步骤:

  1. UNOIDL 编译程序将 .idl 文件 some.idl 编译到 urd 文件中。
  2. 生成的二进制 .urd 文件合并到新的 simple_component.rdb。
  3. 工具 xml2cmp 解析 XML 组件说明 simple_component.xml,以了解编译所需的类型。此文件介绍了用于部署的服务实现,例如实现的目的和使用的类型。如果需要有关这些 XML 文件的语法的更多信息,请访问 http://udk.openoffice.org/common/man/module_description.html。
  4. 步骤 3 中解析的类型将传送到 cppumaker,它将使用 simple_component.rdb 和存储在您的 OpenOffice.org 的程序目录中的 OpenOffice.org 类型库 types.rdb 在包括目录的输出中生成相应的标头对。
Tip.png 对于您自己的组件,您可以简化步骤 3 和 4,使用 -T 选项将您的组件所用的类型传送到 cppumaker。


  1. 编译源文件 service1_impl.cxx 和 service2_impl.cxx。
  2. 共享库被链接出对象文件,而是动态连接到 UNO 基本库 sal、cppu 和 cppuhelper。共享库的名称在 Unix 上是 libsimple_component.so,在 Windows 上是 simple_component.dll。
Documentation caution.png 通常,共享库组件应限制其导出,仅导出上面提到的函数(前缀为 component_),以避免 Unix 上的符号冲突。此外,对于 GUN gcc3 C++ 编译程序,还要导出异常的 RTTI 符号。
  1. 共享库组件注册到 simple_component.rdb 中。此操作也可以通过手动运行以下命令来完成。
 $ regcomp -register -r simple_component.rdb -c simple_component.dll


测试注册并使用

组件的注册表 simple_component.rdb 拥有已注册的服务实现的条目。如果已成功注册库,请运行:

 $ regview simple_component.rdb


其结果应类似如下所示:

 /
   / UCR
     / my_module
       / XSomething
 
         ... interface information ...
 
   / IMPLEMENTATIONS
     / my_module.my_sc_impl.MyService2
       / UNO
         / ACTIVATOR
           Value: Type = RG_VALUETYPE_STRING
                  Size = 34
                  Data = "com.sun.star.loader.SharedLibrary"
 
         / SERVICES
           / my_module.MyService2
         / LOCATION
           Value: Type = RG_VALUETYPE_STRING
                  Size = 21
                  Data = "simple_component.dll"
 
     / my_module.my_sc_impl.MyService1
       / UNO
         / ACTIVATOR
           Value: Type = RG_VALUETYPE_STRING
                  Size = 34
                  Data = "com.sun.star.loader.SharedLibrary"
 
         / SERVICES
           / my_module.MyService1
         / LOCATION
           Value: Type = RG_VALUETYPE_STRING
                  Size = 21
                  Data = "simple_component.dll"
 
   / SERVICES
     / my_module.MyService1
       Value: Type = RG_VALUETYPE_STRINGLIST
              Size = 40
              Len = 1
              Data = 0 = "my_module.my_sc_impl.MyService1"
 
     / my_module.MyService2
       Value: Type = RG_VALUETYPE_STRINGLIST
              Size = 40
              Len = 1
              Data = 0 = "my_module.my_sc_impl.MyService2"


OpenOffice.org 可以识别插入 OpenOffice.org 的程序目录的 unorc 文件(在 Unix 上;在 Windows 上是 uno.ini)中的注册表文件。通过 simple_component.rdb 扩展该文件中的类型和服务。给定文件必须是绝对文件 URL,但是如果 rdb 被复制到 OpenOffice.org 程序目录,则可以使用 $ORIGIN 宏,如以下 unorc 文件所示:

 [Bootstrap]
 UNO_TYPES=$ORIGIN/types.rdb $ORIGIN/simple_component.rdb
 UNO_SERVICES=$ORIGIN/services.rdb $ORIGIN/simple_component.rdb


第二,运行 OpenOffice.org 时,请扩展 PATH (Windows) 或 LD_LIBRARY_PATH (Unix),包括建立的输出路径,以便加载程序可以找到组件。如果共享库被复制到程序目录或程序目录内创建的链接(仅适用于 Unix),则不要扩展路径。


启动 OpenOffice.org Basic 脚本中的测试组件的操作很简单,如以下代码所示:

 Sub Main
 
     REM calling service1 impl
     mgr = getProcessServiceManager()
     o = mgr.createInstance("my_module.MyService1")
     MsgBox o.methodOne("foo")
     MsgBox o.dbg_supportedInterfaces
 
     REM calling service2 impl
     dim args( 0 )
     args( 0 ) = "foo"
     o = mgr.createInstanceWithArguments("my_module.MyService2", args())
     MsgBox o.methodOne("bar")
     MsgBox o.dbg_supportedInterfaces
 
 End Sub


此程序可以实例化服务实现,并执行对其接口的调用。methodOne() 调用返回的值将在消息框中显示。Basic 对象属性 dbg_supportedInterfaces 将通过对象的 com.sun.star.lang.XTypeProvider 接口检索信息。


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