Passing Structures in OLE Automation (122289)
The information in this article applies to:
- Microsoft OLE Libraries for Windows and Win32s 2.02
- Microsoft Visual Basic Standard Edition for Windows 3.0
This article was previously published under Q122289 SUMMARY
OLE Automation does not allow structures to be passed as parameters.
Automation servers that work with standard controllers like Visual Basic
can model a structure as an automation object or pass simple structures as
a safearray of VT_UI1. Automation servers that work with custom controllers
can pass structures as a safearray of VT_UI1 or by passing a data transfer
object that supports IDataObject.
MORE INFORMATION
OLE Automation does not support passing structures as parameters to
automation methods and properties. Here are some ways to work around this: NOTE: Standard controllers are products such as Visual Basic that can
control any automation server. A custom controller is written to
control a specific automation server.
If the Automation server is designed to work with standard controllers such
as Visual Basic, the structure could be modeled as an automation object.
For example, consider this structure:
struct point {
short x;
short y;
};
This could modeled as an automation object with two properties, x and y.
Visual Basic code such as the following could be used to get and set the
values of the properties. NOTE: The CreateLine method, which required
two points as parameters, is implemented as taking references to two
automation objects.
Dim Application As Object
Dim P1 As Object
Dim P2 As Object
Dim Line As Object
:
Set P1 = Application.CreatePoint()
P1.x = 3
P1.y = 4
Set P2 = Application.CreatePoint()
P2.x = 20
P2.y = 21
Set Line = Application.CreateLine(P1, P2)
The CreatePoint method returns a Point automation object whose x & y
properties are set. The type of the value returned by CreatePoint is
IDispatch* or a pointer to an object that supports automation. The
CreateLine method takes two parameters of type IDispatch* or a pointer
to an object that supports automation.
The disadvantage of this solution is that if the automation server is
not an inproc server, each property access will result in the overhead
of an LRPC/RPC call.
If the automation server is designed to work with custom controllers, the
structure could be serialized into a safearray of VT_UI1 and the resultant
binary data could be passed as a parameter of type SAFEARRAY(unsigned
char). Another solution is to create a data transfer object that supports
IDataObject. The IUnknown of this data transfer object could be passed in a
parameter of type IUnknown*. The server could then use IDataObject::GetData
with a private clipboard format to get the storage medium in which the
structure was serialized. Simple structures can be passed from Visual Basic
using a safearray of VT_UI1 as described in Don Box's OLE column in the
June 1996 issue of the Microsoft Systems Journal. NOTE: Serializing the structure into a BSTR will not work because
the Unicode-ANSI conversions done by OLE's 16:32 bit interoperablity
layer assumes that BSTRs contain strings and not binary data. Consequently,
binary data passed in BSTRs can be corrupted by such conversions. However,
serializing binary data into BSTRs will work if both controller and server
are 16-bit. It will also work if both the controller and server are 32-bit
and both support Unicode. This is because 32-bit OLE supports only Unicode,
not ANSI. A safearray of VT_UI is preferred because of these limitations
of passing binary data through BSTRs.
Modification Type: | Major | Last Reviewed: | 10/15/2003 |
---|
Keywords: | kbAutomation kbcode KB122289 |
---|
|