类型的用法
接口
许多 UNO 接口函数将接口作为参数。如果是这样,可以通过三种方法获取支持所需接口的实例:
- 请服务管理器创建一项实现该接口的服务。
- 调用 UNO 对象中可以返回特定接口的函数。
- 如果需要侦听器对象,提供接口实现。如果需要详细信息,请参阅 专业 UNO - UNO 语言绑定 - Automation 桥 - 具有 UNO 接口的 Automation 对象。
如果通过服务管理器或返回接口的另一个 UNO 函数来调用 createInstance(),则包装返回的对象,这样该对象就看起来像一个 COM 分发对象。如果调用某个 UNO 函数时传送该对象,就会从包装程序中提取原始 UNO 对象,而且桥确保将正确的接口传送给该函数。如果使用 UNO 对象,就无需处理 UNO 接口。确保在通过调用某个 UNO 对象而获取的对象实现了正确的接口后,再将该接口传送回另一个 UNO 调用。
结构
Automation 不识别结构,因为结构存在于其他语言,例如 C++。而是使用 Automation 对象,此类对象包含一组与 C++ 结构字段类似的属性。设定或读取成员时最终需要调用 IDispatch::Invoke。但在 VB、VBScript 和 JScript 等语言中,接口调用由于编程语言而变得模糊。访问属性像使用 C++ 结构一样容易。
// VB. obj is an object that implements a UNO struct obj.Width= 100 obj.Height= 100
无论 UNO 函数何时需要把结构作为参数,必须从 UNO 环境获取该结构。不能声明一个结构。例如,假定有一个办公软件函数 setSize(),该函数需要一个类型为 Size 的结构。该结构的声明如下:
// UNO IDL
struct Size
{
long Width;
long Height;
}
// the interface function, that will be called from script
void XShape::setSize( Size aSize)
不能编写类似以下示例所示的代码 (VBScript):
Class Size
Dim Width
Dim Height
End Class
'obtain object that implements Xshape
'now set the size
call objXShape.setSize( new Size) // wrong
可以通过调用服务管理器对象的 com.sun.star.reflection.CoreReflection 服务或 Bridge_GetStruct 函数来创建结构。以下示例使用的是 CoreReflection 服务
'VBScript in Windows Scripting Host
Set objServiceManager= Wscript.CreateObject("com.sun.star.ServiceManager")
'Create the CoreReflection service that is later used to create structs
Set objCoreReflection= objServiceManager.createInstance("com.sun.star.reflection.CoreReflection")
'get a type description class for Size
Set classSize= objCoreReflection.forName("com.sun.star.awt.Size")
'create the actual object
Dim aSize
classSize.createObject aSize
'use aSize
aSize.Width= 100
aSize.Height= 12
'pass the struct into the function
objXShape.setSize aSize
而下一个示例则说明如何使用 Bridge_GetStruct。
Set objServiceManager= Wscript.CreateObject("com.sun.star.ServiceManager")
Set aSize= objServiceManager.Bridge_GetStruct("com.sun.star.awt.Size")
'use aSize
aSize.Width= 100
aSize.Height= 12
objXShape.setSize aSize
Bridge_GetStruct 函数由服务管理器对象提供,该对象最初由 CreateObject (Visual Basic) 或 CoCreateInstance[Ex] (VC++) 创建。
对应的 C++ 示例看起来比较复杂,但归根结底都是必需的相同步骤。通过调用 CoreReflection 服务的方法 forName(),将返回一个 com.sun.star.reflection.XIdlClass,可以请求其使用 createObject() 创建实例:
// create the service manager of OpenOffice
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);
// create the CoreReflection service
OLECHAR* funcName= L"createInstance";
DISPID id;
pdispFactory->GetIDsOfNames( IID_NULL, &funcName, 1, LOCALE_USER_DEFAULT, &id);
VARIANT param1;
VariantInit( ¶m1);
param1.vt= VT_BSTR;
param1.bstrVal= SysAllocString( L"com.sun.star.reflection.CoreReflection");
DISPPARAMS dispparams= { ¶m1, 0, 1, 0};
VARIANT result;
VariantInit( &result);
hr= pdispFactory->Invoke( id, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD,
&dispparams, &result, NULL, 0);
IDispatch* pdispCoreReflection= result.pdispVal;
pdispCoreReflection->AddRef();
VariantClear( &result);
// create the struct's idl class object
OLECHAR* strforName= L"forName";
hr= pdispCoreReflection->GetIDsOfNames( IID_NULL, &strforName, 1, LOCALE_USER_DEFAULT, &id);
VariantClear( ¶m1);
param1.vt= VT_BSTR;
param1.bstrVal= SysAllocString(L"com.sun.star.beans.PropertyValue");
hr= pdispCoreReflection->Invoke( id, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_METHOD, &dispparams, &result, NULL, 0);
IDispatch* pdispClass= result.pdispVal;
pdispClass->AddRef();
VariantClear( &result);
// create the struct
OLECHAR* strcreateObject= L"createObject";
hr= pdispClass->GetIDsOfNames( IID_NULL,&strcreateObject, 1, LOCALE_USER_DEFAULT, &id)
IDispatch* pdispPropertyValue= NULL;
VariantClear( ¶m1);
param1.vt= VT_DISPATCH | VT_BYREF;
param1.ppdispVal= &pdispPropertyValue;
hr= pdispClass->Invoke( id, IID_NULL, LOCALE_USER_DEFAULT,
DISPATCH_METHOD, &dispparams, NULL, NULL, 0);
// do something with the struct pdispPropertyValue contained in dispparams
// ...
pdispPropertyValue->Release();
pdispClass->Release();
pdispCoreReflection->Release();
pdispFactory->Release();
Bridge_GetStruct 示例。
// objectServiceManager is the service manager of the office OLECHAR* strstructFunc= L"Bridge_GetStruct"; hr= objServiceManager->GetIDsOfNames( IID_NULL, &strstructFunc, 1, LOCALE_USER_DEFAULT, &id); VariantClear(&result); VariantClear( ¶m1); param1.vt= VT_BSTR; param1.bstrVal= SysAllocString( L"com.sun.star.beans.PropertyValue"); hr= objServiceManager->Invoke( id, IID_NULL,LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, &result, NULL, 0); IDispatch* pdispPropertyValue= result.pdispVal; pdispPropertyValue->AddRef(); // do something with the struct pdispPropertyValue ...
JScript:
// struct creation via CoreReflection
var objServiceManager= new ActiveXObject("com.sun.star.ServiceManager");
var objCoreReflection= objServiceManager.createInstance("com.sun.star.reflection.CoreReflection");
var classSize= objCoreReflection.forName("com.sun.star.awt.Size");
var outParam= new Array();
classSize.createObject( outParam);
var size= outParam[0];
//use the struct
size.Width=111;
size.Height=112;
// ----------------------------------------------------
// struct creation by bridge function
var objServiceManager= new ActiveXObject("com.sun.star.ServiceManager");
var size= objServiceManager.Bridge_GetStruct("com.sun.star.awt.Size");
size.Width=111;
size.Height=112;
| Content on this page is licensed under the Public Documentation License (PDL). |