Difference between revisions of "Zh/Documentation/DevGuide/ProUNO/Bridge/The Service Manager Component"
(New page: {{Documentation/DevGuide/ProUNOTOC/Zh |ProUNO2c=block |ABridgeSvcMgr=block |ShowPrevNext=block |PrevPage=Zh/Documentation/DevGuide/ProUNO/Bridge/Automation Bridge |NextPage=Zh/Documentatio...) |
m |
||
Line 134: | Line 134: | ||
− | === | + | === 从 UNO 对象到 Automation 对象 === |
Revision as of 08:53, 17 July 2008
实例化
服务管理器是所有 Automation 客户机的出发点。获取任何 UNO 对象之前,都需要创建服务管理器。由于服务管理器是一个 COM 组件,它具有一个 CLSID
和一个编程标识符 com.sun.star.ServiceManager
。服务管理器的实例化方式与任何 ActiveX 组件类似,具体取决于使用的语言:
//C++ IDispatch* pdispFactory= NULL; CLSID clsFactory= {0x82154420,0x0FBF,0x11d4,{0x83, 0x13,0x00,0x50,0x04,0x52,0x6A,0xB4}}; hr= CoCreateInstance( clsFactory, NULL, CLSCTX_ALL, __uuidof(IDispatch), (void**)&pdispFactory);
在 Visual C++ 中,使用类可以简化 COM 指针的使用。如果使用动态模板库 (ATL),则示例如下所示:
CComPtr<IDispatch> spDisp; if( SUCCEEDED( spDisp.CoCreateInstance("com.sun.star.ServiceManager"))) { // do something }
JScript:
var objServiceManager= new ActiveXObject("com.sun.star.ServiceManager");
Visual Basic:
Dim objManager As Object Set objManager= CreateObject("com.sun.star.ServiceManager")
具有 WSH 的 VBScript:
Set objServiceManager= WScript.CreateObject("com.sun.star.ServiceManager")
具有 WSH 的 JScript:
var objServiceManager= WScript.CreateObject("com.sun.star.ServiceManager");
也可以远程(即在另一台计算机上)创建服务管理器,并将安全方面的问题考虑在内。例如,在系统注册表中设置服务管理器的启动和访问权限(请参阅 DCOM)。
服务管理器的代码驻留在办公软件可执行程序 soffice.exe 中。无论何时只要客户机尝试获取服务管理器的类工厂,COM 都会启动该可执行程序,这样客户机就可以使用该程序。
Registry Entries
为使实例化取得成功,必须在系统注册表中正确注册服务管理器。下表中显示的项和数值都是在安装期间写入的。要使用办公软件的 Automation 功能,无需编辑它们。安装后,Automation 立即可以工作。 HKEY_CLASSES_ROOT
下具有三个不同的键,其具有以下值和子键:
键 | 值 |
---|---|
CLSID\{82154420-0FBF-11d4-8313-005004526AB4} | "StarOffice Service Manager (Ver 1.0)" |
子键 | |
LocalServer32 | "<OfficePath>\program\soffice.exe" |
NotInsertable | |
ProgIDcom.sun.star.ServiceManager.1 | "com.sun.star.ServiceManager.1" |
Programmable | |
VersionIndependentProgID | "com.sun.star.ServiceManager" |
键 | 值 |
---|---|
com.sun.star.ServiceManager | "StarOffice Service Manager" |
子键 | |
CLSID | "{82154420-0FBF-11d4-8313-005004526AB4}" |
CurVer | "com.sun.star.ServiceManager.1" |
键 | 值 |
---|---|
com.sun.star.ServiceManager.1 | "StarOffice Service Manager (Ver 1.0)" |
子键 | |
CLSID | "{82154420-0FBF-11d4-8313-005004526AB4}" |
CLSID\{82154420-0FBF-11d4-8313-005004526AB4}\LocalServer32
的键值反映办公软件可执行程序的路径。
所有键在 HKEY_LOCAL_MACHINE\SOFTWARE\Classes\
下都有副本。
服务管理器是一个 ActiveX 组件,但不支持自注册。即,办公软件不支持命令行参数 -RegServer
和 -UnregServer
。
服务管理器以及服务管理器创建的所有对象和作为函数调用返回值从服务管理器间接产生的所有对象,都是合法的 Automation 对象。也可以通过 DCOM 远程访问这些对象。
从 UNO 对象到 Automation 对象
服务管理器基于 UNO 服务管理器,并与其他所有UNO 组件类似,与 Automation 不兼容。可以通过 COM API 访问服务管理器,因为服务管理器是 OpenOffice.org 可执行程序中包含的一个 ActiveX 组件。当客户机创建服务管理器(例如通过调用 CreateObject()
)时,如果办公软件未运行,则通过COM 系统启动办公软件。办公软件然后为服务管理器创建一个类工厂,并将其注册到 COM。接着,COM 使用该工厂来实例化服务管理器并将其返回到客户机。
调用函数 IClassFactory::CreateInstance
后,UNO 服务管理器被转换成 Automation 对象。实际转换由 UNO 服务 com.sun.star.bridge.oleautomation.BridgeSupplier 执行(请参阅 专业 UNO - UNO 语言绑定 - Automation 桥 - 桥服务)。产生的 Automation 对象包含 UNO 对象,并将 IDispatch::Invoke
调用转换成对各自 UNO 接口函数的调用。根据定义的映射(请参阅 专业 UNO - UNO 语言绑定 - Automation 桥 - 类型映射)),转换提供的函数参数以及 UNO 函数的返回值。返回的对象被转换成 Automation 对象,这样,获取的所有对象就始终是正确的 Auto- mation 对象。
Content on this page is licensed under the Public Documentation License (PDL). |