引导服务管理器

From Apache OpenOffice Wiki
Jump to: navigation, search


引导服务管理器即创建可以实例化用户所需的 UNO 对象的服务管理器的实例。所有要使用 UnoUrlResolver 以连接到办公软件的 UNO 应用程序必须引导本地服务管理器以便创建 UnoUrlResolver 对象。如果开发者创建新的语言绑定,例如用于脚本引擎,他们必须找到一种方法在目标环境中引导服务管理器。


有许多方法可以引导 UNO C++ 应用程序,每个方法都需要准备一个或多个注册表文件。准备好注册表后,有几种不同的选项可用于引导您的应用程序。一种灵活的方法是使用 UNO 引导参数和 defaultBootstrap_InitialComponentContext() 函数。

  #include <cppuhelper/bootstrap.hxx>
 
  using namespace com::sun::star::uno;
  using namespace com::sun::star::lang;
  using namespace rtl;
  using namespace cppu;
  int main( )
  {
      // create the initial component context
      Reference< XComponentContext > rComponentContext =
          defaultBootstrap_InitialComponentContext();
 
      // retrieve the service manager from the context
      Reference< XMultiComponentFactory > rServiceManager = 
          rComponentContext()->getServiceManager();
 
      // instantiate a sample service with the service manager.
      Reference< XInterface > rInstance =
          rServiceManger->createInstanceWithContext( 
          OUString::createFromAscii("com.sun.star.bridge.UnoUrlResolver" ),
              rComponentContext );
 
      // continue to connect to the office ....
  }


没有参数(例如注册表名称)被传送到此函数,而是使用引导参数给出这些参数。引导参数必须通过命令行、.ini 文件或使用环境变量传送。


对于引导 UNO 组件上下文,将涉及以下两个变量:

  1. UNO_TYPES
给定以空格分隔的类型库注册表文件列表。每个注册表必须作为绝对或相对文件 URL 给定。请注意,路径中某些特殊字符需要编码,例如空格必须是 %20。这些注册表以只读方式打开。
  1. UNO_SERVICES
给定以空格分隔的注册表文件列表,文件中包含组件注册信息。这些注册表以只读方式打开。相同的注册表可能会出现在 UNO_TYPES 和 UNO_SERVICES 变量中。


绝对文件 URL 必须以 file:/// prefix 开始(在 Windows 中必须类似 file:///c:/mytestregistry.rdb)。而相对文件 URL 则必须省略 file:/// prefix。相对 URL 被解释为相对于当前工作目录。


路径中需要使用特殊的占位符。

引导变量 含义
$SYSUSERHOME 用户主目录的路径(请参见 osl_getHomeDir())
$SYSBINDIR 当前可执行文件的目录的路径。
$ORIGIN ini/rc 文件目录的路径。
$SYSUSERCONFIG 存储用户配置数据的目录的路径(请参见 osl_getConfigDir())

此方法的优势在于可以在建立可执行文件之后配置它。OpenOffice.org 将使用此机制引导服务管理器。


请考虑以下示例:

需要编写一个在不同的格式之间转换文档的工具。通过连接到 OpenOffice.org 并进行相应的转换可实现此操作。工具名为 docconv。在代码中,defaultBootstrap_InitialComponentContext() 函数用于创建组件上下文,如上所述。准备两个注册表:包含已注册组件的 docconv_services.rdb 和包含 OpenOffice.org 附带的类型的 types.rdb。这两个文件都放置在可执行文件旁边。配置应用程序最简单的


方法是在与您的可执行文件相同的文件夹中创建 docconv(.ini|rc) ascii 文件,其中包含以下两行:

 UNO_TYPES=$ORIGIN/types.rdb
 UNO_SERVICES=$ORIGIN/docconv_services.rdb

无论应用程序从哪里启动,它始终使用提到的注册表。请注意,由于在运行时计算 $SYSBINDIR 的值,因此如果卷映射到其他位置安装点,则此方法也适用于不同的计算机。

第二个方法是可以将 UNO_TYPES 和 UNO_SERVICES 设定为环境变量,但是此方法存在一些缺 点。所有使用此 Shell 启动的 UNO 应用程序都使用相同的注册表。

第三个方法是可以将变量作为命令行参数传送,例如

 docconv -env:UNO_TYPES=$ORIGIN/types.rdb -env:
 UNO_SERVICES=$ORIGIN/docconv_services.rdb

请注意,在 UNIX Shell 上,需要使用反斜杠 \ 引用 $。


命令行参数不需要传送到 UNO 运行时,因为它通常从某些静态变量中获取。如何完成此操作取决于操作系统,但是却被程序员隐藏了起来。docconv 可执行文件应忽略所有以 '-env:' 开始的命令行参数。完成此操作最简单的方法是忽略 argcargv[],并使用在 rtl/process.h 标头中定义的 rtl_getCommandLineArg() 函数,它将自动分拆附加参数。

  1. 综合运用上述方法。命令行参数优先于 .ini 文件变量,.ini 文件变量优先于环境变量。这样,则可以只改写调用程序的一个命令行的 UNO_SERVICES 变量。
Content on this page is licensed under the Public Documentation License (PDL).
Personal tools
In other languages