引导服务管理器
引导服务管理器即创建可以实例化用户所需的 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 组件上下文,将涉及以下两个变量:
- UNO_TYPES
- 给定以空格分隔的类型库注册表文件列表。每个注册表必须作为绝对或相对文件 URL 给定。请注意,路径中某些特殊字符需要编码,例如空格必须是 %20。这些注册表以只读方式打开。
- 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:' 开始的命令行参数。完成此操作最简单的方法是忽略 argc
和 argv[]
,并使用在 rtl/process.h 标头中定义的 rtl_getCommandLineArg()
函数,它将自动分拆附加参数。
- 综合运用上述方法。命令行参数优先于 .ini 文件变量,.ini 文件变量优先于环境变量。这样,则可以只改写调用程序的一个命令行的 UNO_SERVICES 变量。
Content on this page is licensed under the Public Documentation License (PDL). |