Main Content

Handle COM Data inMATLAB

Pass Data to COM Objects

When you use a COM object in a MATLAB®command, the MATLAB types you pass in the call are converted to types native to the COM object. MATLAB performs this conversion on each argument that is passed. This section describes the conversion.

MATLAB converts MATLAB arguments into types that best represent the data to the COM object. The following table shows all the MATLAB base types for passed arguments and the COM types defined for input arguments. Each row shows a MATLAB type followed by the possible COM argument matches. For a description of COM variant types, see the table inHandle Data from COM Objects.

MATLAB Argument Closest COM Type Allowed Types
handle VT_DISPATCH
VT_UNKNOWN
VT_DISPATCH
VT_UNKNOWN
character vector VT_BSTR VT_LPWSTR
VT_LPSTR
VT_BSTR
VT_FILETIME
VT_ERROR
VT_DECIMAL
VT_CLSID
VT_DATE
int16 VT_I2 VT_I2
uint16 VT_UI2 VT_UI2
int32 VT_I4 VT_I4
VT_INT
uint32 VT_UI4 VT_UI4
VT_UINT
int64 VT_I8 VT_I8
uint64 VT_UI8 VT_UI8
single VT_R4 VT_R4
double VT_R8 VT_R8
VT_CY
logical VT_BOOL VT_BOOL
char VT_I1 VT_I1
VT_UI1

Variant Data

variantis any data type except a structure or a sparse array. (For more information, seeFundamental MATLAB Classes.)

When used as an input argument, MATLAB treatsvariantandvariant(pointer) the same way.

If you pass an empty array ([]) of typedouble, MATLAB creates avariant(pointer) set toVT_EMPTY. Passing an empty array of any other numeric type is not supported.

MATLAB Argument Closest COM Type Allowed Types
variant VT_VARIANT VT_VARIANT
VT_USERDEFINED
VT_ARRAY
variant(pointer) VT_VARIANT VT_VARIANT|VT_BYREF

SAFEARRAY Data

When a COM method identifies aSAFEARRAYorSAFEARRAY(pointer), the MATLAB equivalent is a matrix.

MATLAB Argument Closest COM Type Allowed Types
SAFEARRAY VT_SAFEARRAY VT_SAFEARRAY
SAFEARRAY(pointer) VT_SAFEARRAY VT_SAFEARRAY|VT_BYREF

Handle Data from COM Objects

Data returned from a COM object is often incompatible with MATLAB types. When this occurs, MATLAB converts the returned value to a data type native to the MATLAB language. This section describes the conversion performed on the various types that can be returned from COM objects.

The following table shows how MATLAB converts data from a COM object into MATLAB variables.

COM Variant Type

Description

MATLAB Representation

VT_DISPATCH

IDispatch *

handle
VT_LPWSTR
VT_LPSTR
VT_BSTR
VT_FILETIME
VT_ERROR
VT_DECIMAL
VT_CLSID
VT_DATE

widenullterminated string
nullterminated string
OLE Automation string
FILETIME
SCODE
16-byte fixed point
Class ID
date

character vector
VT_INT
VT_UINT
VT_I2
VT_UI2
VT_I4
VT_UI4
VT_R4
VT_R8
VT_CY

signed machine int
unsigned machine int
2-bytesigned int
unsigned short
4-bytesigned int
unsigned long
4-bytereal
8-bytereal
currency

double
VT_I8

signed int64

int64
VT_UI8

unsigned int64

uint64
VT_BOOL logical
VT_I1
VT_UI1
signed char
unsigned char
char
VT_VARIANT
VT_USERDEFINED
VT_ARRAY

VARIANT *
user-defined type
SAFEARRAY*

variant
VT_VARIANT|VT_BYREF

VARIANT *
void*for local use

variant(pointer)
VT_SAFEARRAY

useVT_ARRAYinVARIANT

SAFEARRAY
VT_SAFEARRAY|VT_BYREF SAFEARRAY(pointer)

Unsupported Types

MATLAB does not support the following COM interface types.

  • Structure

  • Sparse array

  • MultidimensionalSAFEARRAYs (greater than two dimensions)

  • Write-only properties

PassMATLABSAFEARRAY to COM Object

TheSAFEARRAYdata type is a standard way to pass arrays between COM objects. This section explains how MATLAB passesSAFEARRAYdata to a COM object.

Default Behavior inMATLAB

MATLAB represents anm-by-nmatrix as a two-dimensionalSAFEARRAY, where the first dimension hasmelements and the second dimension hasnelements. MATLAB passes theSAFEARRAYby value.

Examples

The following examples use a COM object that expects aSAFEARRAYinput parameter.

When MATLAB passes a1-by-3array:

B = [2 3 4] B = 2 3 4

the object reads:

No. of dimensions: 2 Dim: 1, No. of elements: 1 Dim: 2, No. of elements: 3 Elements: 2.0 3.0 4.0

When MATLAB passes a3-by-1array:

C = [1;2;3] C = 1 2 3

the object reads:

No. of dimensions: 2 Dim: 1, No. of elements: 3 Dim: 2, No. of elements: 1 Elements: 1.0 2.0 3.0

When MATLAB passes a2-by-4array:

D = [2 3 4 5;5 6 7 8] D = 2 3 4 5 5 6 7 8

the object reads:

No. of dimensions: 2 Dim: 1, No. of elements: 2 Dim: 2, No. of elements: 4 Elements: 2.0 3.0 4.0 5.0 5.0 6.0 7.0 8.0

Pass Single-Dimension SAFEARRAY

For information, seeHow can I pass arguments to an ActiveX server from MATLAB 7.0 (R14) as one-dimensional arrays?

Pass SAFEARRAY by Reference

For information, seeHow can I pass arguments by reference to an ActiveX server from MATLAB 7.0 (R14)?

Read SAFEARRAY from COM Objects inMATLABApplications

This section explains how MATLAB readsSAFEARRAYdata from a COM object.

MATLAB reads a one-dimensionalSAFEARRAYwithnelements from a COM object as a1-by-nmatrix.

MATLAB reads a two-dimensionalSAFEARRAYwithnelements as a2-by-nmatrix.

MATLAB reads a three-dimensionalSAFEARRAYwith two elements as a2-by-2-by-2cell array.

DisplayMATLABSyntax for COM Objects

To determine which MATLAB types to use when passing arguments to COM objects, use theinvokeormethodsviewfunctions. These functions list all the methods found in an object, along with a specification of the types required for each argument.

Consider a server calledMyApp, which has a single methodTestMeth1with the following syntax:

HRESULT TestMeth1 ([out, retval] double* dret);

This method has no input argument, and it returns a variable of typedouble. The followingpseudo-codedisplays the MATLAB syntax for calling the method.

h = actxserver('MyApp'); invoke(h)

MATLAB displays:

ans = TestMeth1 = Te的两倍stMeth1 (handle)

The signature ofTestMeth1is:

double TestMeth1(handle)

MATLAB requires you to use an object handle as an input argument for every method, in addition to any input arguments required by the method itself.

Use one of the followingpseudo-codecommands to create the variablevar, which is of typedouble.

var = h.TestMeth1;

or:

var = TestMeth1(h);

Although the following syntax is correct, its use is discouraged:

var = invoke(h,'TestMeth1');

Now consider the server calledMyApp1with the following methods:

HRESULT TestMeth1 ([out, retval] double* dret); HRESULT TestMeth2 ([in] double* d, [out, retval] double* dret); HRESULT TestMeth3 ([out] BSTR* sout, [in, out] double* dinout, [in, out] BSTR* sinout, [in] short sh, [out] long* ln, [in, out] float* b1, [out, retval] double* dret);

Using theinvokefunction, MATLAB displays the list of methods:

ans = TestMeth1 = Te的两倍stMeth1 (handle) TestMeth2 = double TestMeth2 (handle, double) TestMeth3 = [double, string, double, string, int32, single] ... TestMeth3(handle, double, string, int16, single)

TestMeth2requires an input argumentdof typedouble, and returns a variabledretof typedouble. Somepseudo-codeexamples of callingTestMeth2are:

var = h.TestMeth2(5);

or:

var = TestMeth2(h, 5);

TestMeth3requires multiple input arguments, as indicated within the parentheses on the right side of the equal sign, and returns multiple output arguments, as indicated within the brackets on the left side of the equal sign.

[double, string, double, string, int32, single] %output arguments TestMeth3(handle, double, string, int16, single) %input arguments

The first input argument is the requiredhandle, followed by four input arguments.

TestMeth3(handle, in1, in2, in3, in4)

The first output argument is the return valueretval, followed by five output arguments.

[retval, out1, out2, out3, out4, out5]

This is how the arguments map into a MATLAB command:

[dret, sout, dinout, sinout, ln, b1] = TestMeth3(handle, ... dinout, sinout, sh, b1)

wheredretisdouble,soutisstring,dinoutisdoubleand is both an input and an output argument,sinoutisstring(input and output argument),lnisint32,b1issingle(input and output argument),handleis the handle to the object, andshisint16.