当你在MATLAB中使用COM对象时®命令,在调用中传递的MATLAB类型被转换为COM对象的原生类型。MATLAB对传入的每个参数执行这个转换。本节描述转换过程。
MATLAB将MATLAB参数转换为最能代表COM对象数据的类型。下表显示了传递参数的所有MATLAB基类型和为输入参数定义的COM类型。每行显示MATLAB类型,后跟可能的COM参数匹配。有关COM变体类型的说明,请参见处理COM对象的数据.
MATLAB的论点 | 最近的COM类型 | 允许的类型 |
---|---|---|
处理 | VT_DISPATCH VT_UNKNOWN |
VT_DISPATCH VT_UNKNOWN |
特征向量 | 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 |
单 |
VT_R4 |
VT_R4 |
双 |
VT_R8 |
VT_R8 VT_CY |
逻辑 |
VT_BOOL |
VT_BOOL |
字符 | VT_I1 |
VT_I1 VT_UI1 |
变体
是除结构或稀疏数组外的任何数据类型。(有关更多信息,请参见基本的MATLAB类.)
当用作输入参数时,MATLAB处理变体
和变体
(指针)同样的方法。
如果你传递一个空数组([]
类型的)双
, MATLAB创建变体
(指针)VT_EMPTY
.不支持传递任何其他数字类型的空数组。金宝app
MATLAB的论点 | 最近的COM类型 | 允许的类型 |
---|---|---|
变体 |
VT_VARIANT |
VT_VARIANT VT_USERDEFINED VT_ARRAY |
变体 (指针) |
VT_VARIANT |
VT_VARIANT |VT_BYREF |
当一个COM方法标识一个SAFEARRAY
或SAFEARRAY
(指针),MATLAB等价为一个矩阵。
MATLAB的论点 | 最近的COM类型 | 允许的类型 |
---|---|---|
SAFEARRAY |
VT_SAFEARRAY |
VT_SAFEARRAY |
SAFEARRAY (指针) |
VT_SAFEARRAY |
VT_SAFEARRAY |VT_BYREF |
COM对象返回的数据通常与MATLAB类型不兼容。当出现这种情况时,MATLAB将返回值转换为MATLAB语言的原生数据类型。本节描述对可以从COM对象返回的各种类型执行的转换。
下表显示了MATLAB如何将数据从COM对象转换为MATLAB变量。
COM变异类型 |
描述 |
MATLAB表示 |
---|---|---|
VT_DISPATCH |
|
处理 |
VT_LPWSTR VT_LPSTR VT_BSTR VT_FILETIME VT_ERROR VT_DECIMAL VT_CLSID VT_DATE |
宽 |
特征向量 |
VT_INT VT_UINT VT_I2 VT_UI2 VT_I4 VT_UI4 VT_R4 VT_R8 VT_CY |
|
双 |
VT_I8 |
|
int64 |
VT_UI8 |
|
uint64 |
VT_BOOL |
逻辑 |
|
VT_I1 VT_UI1 |
签署了字符 无符号字符 |
字符 |
VT_VARIANT VT_USERDEFINED VT_ARRAY |
|
变体 |
VT_VARIANT |VT_BYREF |
|
变体 (指针) |
VT_SAFEARRAY |
使用 |
SAFEARRAY |
VT_SAFEARRAY |VT_BYREF |
SAFEARRAY (指针) |
MATLAB不支持以下COM接口金宝app类型。
结构
稀疏阵列
多维SAFEARRAY
S(大于二维)
只写属性
的SAFEARRAY
数据类型是在COM对象之间传递数组的标准方法。本节解释MATLAB如何通过SAFEARRAY
数据到COM对象。
MATLAB是一个米
——- - - - - -n
二维矩阵SAFEARRAY
,其中第一个维度米
元素和第二维度都有n
元素。MATLAB传递SAFEARRAY
的价值。
下面的例子使用了一个COM对象SAFEARRAY
输入参数。
当MATLAB通过1
——- - - - - -3.
数组:
B = [2 3 4] B = [2 3 4
对象:
不。尺寸:2 Dim: 1, No. 1元素:1、Dim: 2、No。元素:2.0 3.0 4.0
当MATLAB通过3.
——- - - - - -1
数组:
C = [1;2;3
对象:
不。尺寸:2 Dim: 1, No. 1元素:3 Dim: 2, No。元素:1.0 2.0 3.0
当MATLAB通过2
——- - - - - -4
数组:
D = [2 3 4 5;5 6 7 8
对象:
不。尺寸:2 Dim: 1, No. 1元素:2 Dim: 2, No。元素:2.0 3.0 4.0 5.0 5.0 6.0 7.0 8.0
本节解释MATLAB如何读取SAFEARRAY
COM对象的数据。
MATLAB读取一维SAFEARRAY
与n
将COM对象中的1
——- - - - - -n
矩阵。
MATLAB读取一个二维SAFEARRAY
与n
作为一个元素2
——- - - - - -n
矩阵。
MATLAB读取三维SAFEARRAY
用两个元素作为a2
——- - - - - -2
——- - - - - -2
单元阵列。
要确定在将参数传递给COM对象时使用哪种MATLAB类型,请使用调用
或methodsview
功能。这些函数列出了在对象中找到的所有方法,以及每个参数所需的类型说明。
考虑一个服务器MyApp
,它只有一个方法TestMeth1
使用以下语法:
HRESULT TestMeth1 ([out, retval] double* dret); / /输出
这个方法没有输入参数,它返回一个类型变量双
.以下伪代码显示调用该方法的MATLAB语法。
h = actxserver(“MyApp”);调用(h)
MATLAB显示:
TestMeth1 = double TestMeth1(句柄)
的签名TestMeth1
是:
双TestMeth1(处理)
MATLAB要求您使用对象句柄作为每个方法的输入参数,以及方法本身所需的任何输入参数。
使用下列任一种伪代码创建变量的命令var
,是典型的双
.
var = h.TestMeth1;
或者:
var = TestMeth1 (h);
尽管下面的语法是正确的,但还是不鼓励使用:
var =调用(h,“TestMeth1”);
现在考虑调用的服务器MyApp1
采用以下方法:
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); / /输出
使用调用
函数,MATLAB显示方法列表:
TestMeth1 = double TestMeth1 (handle) TestMeth2 = double TestMeth2 (handle, double) TestMeth3 = [double, string, double, string, int32, single]…TestMeth3(句柄,双引号,字符串,int16,单引号)
TestMeth2
需要输入参数d
类型的双
,并返回一个变量dret
类型的双
.一些伪代码调用的例子TestMeth2
是:
var = h.TestMeth2 (5);
或者:
var = TestMeth2(h, 5);
TestMeth3
需要多个输入参数,如等号右侧的括号中所示,并返回多个输出参数,如等号左侧的括号中所示。
TestMeth3(handle, double, string, int16, single) %输入参数
第一个输入参数是必需的处理
,后面跟着四个输入参数。
TestMeth3(句柄,in1, in2, in3, in4)
第一个输出参数是返回值retval
,后跟5个输出参数。
[retval, out1, out2, out3, out4, out5]
这是参数映射到MATLAB命令的方式:
[dret, sout, dinout, sinout, ln, b1] = TestMeth3(handle,…Dinout sinout sh b1)
在哪里dret
是双
,多
是字符串
,dinout
是双
并且既是输入参数也是输出参数,sinout
是字符串
(输入输出参数),ln
是int32
,b1
是单
(输入输出参数),处理
对象的句柄是and吗上海
是int16
.