引导服务管理器

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.


引导服务管理器即创建可以实例化用户所需的 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