特殊服务管理器配置
com.sun.star.container.XSet 接口允许在运行时将 com.sun.star.lang.XSingleServiceFactory 或 com.sun.star.lang.XSingleComponentFactory 实现插入到服务管理器或从中删除而不保存这些更改。办公软件应用程序终止时,所有更改都会丢失。插入的对象必须支持 com.sun.star.lang.XServiceInfo 接口。此接口返回的信息与组件工厂创建的组件实现的 XServiceInfo 接口相同。
使用此功能,可以连接正在运行的办公软件,将一个新工厂插入到服务管理器,还可以不必事先注册即实例化新服务。OpenOffice.org 不接受这种对已注册服务硬编码的方法,因为它必须在编译后扩展。
Java 应用程序可以在其各自使用 JNI(请参阅 专业 UNO - UNO 语言绑定 - Java 语言绑定)的进程中使用本机持久的服务管理器,或者在远程进程中使用。但是请注意,所有服务必须在此远程进程中进行实例化。
动态修改服务管理器
在纯 Java 中引导很简单,只需从 Bootstrap 类调用静态运行时方法 createInitialComponentContext()。以下的小测试程序显示了如何在运行时将服务工厂插入服务管理器。示例使用了 编写 UNO 组件 - Java 中的简单组件 中的 Java 组件。完整的代码可以使用 JavaComp 示例组件查找。
示例说明了不论服务是插入到本地 Java 服务管理器还是远程办公软件服务管理器,都可以通过命令行参数进行控制。如果服务插入到办公软件服务管理器,则通过 OpenOffice.org Basic 访问服务。在这两种情况下,组件都可以在本地 Java 进程中运行。
如果服务插入办公软件服务管理器,则可以通过 OpenOffice.org Basic 调用 createUnoService("JavaTestComponentB") 实例化组件,只要 Java 进程未被终止。请注意,要通过以上说明的某种机制向办公软件进程添加新类型,请使用 uno.ini。
public static void insertIntoServiceManager(
XMultiComponentFactory serviceManager, Object singleFactory)
throws com.sun.star.uno.Exception {
XSet set = (XSet ) UnoRuntime.queryInterface(XSet.class, serviceManager);
set.insert(singleFactory);
}
public static void removeFromServiceManager(
XMultiComponentFactory serviceManager, Object singleFactory)
throws com.sun.star.uno.Exception {
XSet set = (XSet) UnoRuntime.queryInterface( XSet.class, serviceManager);
set.remove(singleFactory);
}
public static void main(String[] args) throws java.lang.Exception {
if (args.length != 1) {
System.out.println("usage: RunComponent local|uno-url");
System.exit(1);
}
XComponentContext xLocalComponentContext =
Bootstrap.createInitialComponentContext(null);
// initial serviceManager
XMultiComponentFactory xLocalServiceManager = xLocalComponentContext.getServiceManager();
XMultiComponentFactory xUsedServiceManager = null;
XComponentContext xUsedComponentContext = null;
if (args[0].equals("local")) {
xUsedServiceManager = xLocalServiceManager;
xUsedComponentContext = xLocalComponentContext;
System.out.println("Using local servicemanager");
// now the local servicemanager is used !
}
else {
// otherwise interpret the string as uno-url
Object xUrlResolver = xLocalServiceManager.createInstanceWithContext(
"com.sun.star.bridge.UnoUrlResolver", xLocalComponentContext);
XUnoUrlResolver urlResolver = (XUnoUrlResolver) UnoRuntime.queryInterface(
XUnoUrlResolver.class, xUrlResolver);
Object initialObject = urlResolver.resolve(args[0]);
xUsedServiceManager = (XmultiComponentFactory) UnoRuntime.queryInterface(
XMultiComponentFactory.class, initialObject);
System.out.println("Using remote servicemanager");
// now the remote servicemanager is used.
}
// retrieve the factory for the component implementation
Object factory = TestServiceProvider.__getServiceFactory(
"componentsamples.TestComponentB", null, null);
// insert the factory into the servicemanager
// from now on, the service can be instantiated !
insertIntoServiceManager( xUsedServiceManager, factory );
// Now instantiate one of the services via the servicemanager !
Object objTest= xUsedServiceManager.createInstanceWithContext(
"JavaTestComponentB",xUsedComponentContext);
// query for the service interface
XSomethingB xs= (XSomethingB) UnoRuntime.queryInterface(
XSomethingB.class, objTest);
// and call the test method.
String s= xs.methodOne("Hello World");
System.out.println(s);
// wait until return is pressed
System.out.println( "Press return to terminate" );
while (System.in.read() != 10);
// remove it again from the servicemanager, otherwise we have
// a dangling reference ( in case we use the remote service manager )
removeFromServiceManager( xUsedServiceManager, factory );
// quit, even when a remote bridge is running
System.exit(0);
}
从给定的注册表文件创建 ServiceManager
要从给定的注册表创建服务管理器,请使用包含类型库和组件注册信息的单个注册表。在程序中对注册表名称进行硬编码,并使用 cppuhelper 库中的 createRegistryServiceFactory() 函数。
#include <cppuhelper/servicefactory.hxx>
using namespace com::sun::star::uno;
using namespace com::sun::star::lang;
using namespace rtl;
using namespace cppu;
int main( )
{
// create the service manager on the registry test.rdb
Reference< XMultiServiceFactory > rServiceManager =
createRegistryServiceFactory( OUString::createFromAscii( "test.rdb" ) );
// instantiate a sample service with the service manager.
Reference< XInterface > rInstance =
rServiceManger->createInstance(
OUString::createFromAscii("com.sun.star.bridge.UnoUrlResolver" ) );
// continue to connect to the office ....
}
| Content on this page is licensed under the Public Documentation License (PDL). |