接口和结构的映射
UNO 接口或结构在 Automation 环境中表示为分发对象。也就是说,转换的值可成为实现 IDispatch 的对象。如果映射了 UNO 接口,您还可以通过 IDispatch 访问该对象的其他所有 UNO 接口。换句话说,分发对象可表示 UNO 对象及其所有接口,而不是只表示被转换的那个接口。
现在,如果传送回 UNO 的的分发对象实际上为 UNO 对象或结构,则桥将提取原始的 UNO 接口或结构并进行传送。由于 UNO 分发对象表示整个 UNO 对象,即支持其包含的所有接口,因此,对于所有接口类型,您都可以将该分发对象用作参数。例如:
//UNO IDL methods XFoo getFoo(); void doSomething(XBar arg); 'VB Dim objUno As Object Set objUno = objOtherUnoObject.getFoo() 'The returned interface belongs to an UNO object which implements XFoo and XBar. 'Therefore we can use objUno in this call: call objOtherUnoObject.doSomething(objUno)
如果从 UNO 调用 Automation 对象,则调用的方法可能会将其他 Automation 对象作为 IUnknown* 或 IDispatch* 返回。然后,可以在后面的 Automation 对象调用中将它们用作参数,也可以直接调用。如果为 IUnknown,则该对象还必须支持 IDispatch。要 从 UNO 调用,必须先从 XInterface 中查询 XInvocation。当某一方法返回 IDispatch 时,在 UNO 端将接收到 XInvocation,并且可以立即进行调用。
当将这些接口作为参数传送回对 Automation 对象进行的调用时,桥将传递原始的 IUnknown 或 IDispatch 指针。具体情况取决于参数的类型。请记住:只能对 Automation 对象执行调用。因此,IUnknown 和 IDispatch 是唯一可能的 COM 接口。如果所需的参数为 VARIANT,则将 Automation 对象作为 IUnknown* 传送到 UNO 环境中,该参数将包含 IUnknown*。如果将该对象作为 IDispatch* 传送,则该参数将包含 IDispatch*。例如:
//MIDL
HRESULT getUnknown([out,retval] IUnknown ** arg);
HRESULT getDispatch([out, retval] IDispatch ** arg);
HRESULT setUnknown([in] IUnknown * arg);
HRESULT setDispatch([in] IDispatch * arg);
HRESULT setVariant([in] VARIANT arg);
'StarBasic
Dim objUnknown As Object
Dim objDispatch As Object
Set objUnknown = objAutomation.getUnknown()
Set objDispatch = objAutomation.getDispatch()
objAutomation.setUnknown objUnknown 'Ok
objAutomation.setDispatch objUnknown 'Ok, if objUnknow supports IDispatch,
otherwise a CannotConvertException will be thrown.
objAutomation.setUnknown objDispatch 'OK
objAutomation.setVariant objUnknown 'VARTYPE is VT_Unknown
objAutomation.setVariant objDispatch 'VARTYPE is VT_DISPATCH
为了接收事件(侦听器),可以将 UNO 接口作为分发对象实现 (专业 UNO - UNO 语言绑定 - Automation 桥 - 具有 UNO 接口的 Automation 对象)。该类型的对象可用作 UNO 函数中的参数,该函数需要特定的接口类型。桥将确保为 UNO 函数提供正确的接口。随后,如果将 UNO 接口传送到 Automation 环境中,则将传送原始的 Automation 对象。
如果将 Automation 对象作为 any 的参数传送,则将该对象作为 IUnknown 传送时,该 any 将包含 XInterface;将该对象作为 IDispatch 传送时,该 any 将包含 XInvocation。例如,如果将 UNO 接口 XFoo 作为分发对象实现,将实例作为 Any 参数传送给 UNO,并且 Any 包含 XFoo 而不包含 XInvocation,则必须将该分发对象放在值对象中 (专业 UNO - UNO 语言绑定 - Automation 桥 - 类型映射 - 值对象)。例如:
//UNO method void foo([in] any) 'objUno contains an interface with the method foo. 'It expects that the argument with of type any contains an XFoo 'objFoo is a dispatch object implementing XFoo. Dim objValueObject As Object Set objValueObject = objServiceManager.Bridge_GetValueObject() objValueObject.set "XFoo", objFoo objUno.foo objValueObject
空指针将被转换成所需类型的空指针。也就是说,如果将值为空的 IDispatch 指针作为参数传递到 UNO 方法,则最终参数是所需类型的空指针。这也适用于 UNO 接口指针,这些指针通过调用被传递到 Automation 对象。当 UNO 方法接受结构作为参数,并且从提供空指针(IDispatch 或 IUnknown)的 Automation 环境中进行调用时,该 UNO 方法将接受默认构造的结构。
| Content on this page is licensed under the Public Documentation License (PDL). |