数据转换
转换规则
本节介绍使用 MATLAB® Compiler SDK™ 产品创建的 COM 组件的数据转换规则。这些组件是双接口 COM 对象,支持与自动化兼容的数据类型。
注意
自动化(以前称为 OLE 自动化)是一种允许软件包向脚本工具和其他应用程序公开其独特功能的技术。自动化使用组件对象模型 (COM),但可以独立于其他 OLE 功能(例如就地激活)实现。
小心
请注意,IIS(Internet 信息服务)通常会阻止大多数 COM 自动化,因为它可能带来安全风险。因此,XLSREAD 和其他自动化服务在由 IIS 提供服务时可能会失败,从而导致 object reference not set 等错误。
在 MATLAB Compiler SDK 组件上调用方法时,输入参数将转换为 MATLAB 内部数组格式并传递给编译的 MATLAB 函数。当函数退出时,输出参数从 MATLAB 内部数组格式转换为 COM 自动化类型。
COM 客户端将编译后的 MATLAB 函数中的所有输入和输出参量作为 VARIANT 类型传递。COM VARIANT 类型是几种简单数据类型的联合。VARIANT 类型变量可以存储任何简单类型的变量,以及任何这些值的数组。
Win32 API 提供了许多用于在 C/C++ 中创建和操作 VARIANT 函数,而 Microsoft® Visual Basic® 为这种类型提供了本机语言支持。请参阅 Microsoft Visual Studio® 文档以了解 COM VARIANT 的定义和 API 支持 VARIANT 变量是自描述的,并将其类型代码存储为结构的内部字段。
注意
此处对数据的讨论涉及 VARIANT 和 Variant 数据类型。VARIANT 是 C++ 名称,VARIANT 是 Visual Basic 中 Variant 的数据类型。
看支持的 VARIANT 类型代码获取编译器组件支持的 VARIANT 类型代码列表。
看MATLAB 到 COM VARIANT 的转换规则和COM VARIANT 到 MATLAB 的转换规则用于 COM VARIANT 和 MATLAB 数组之间的转换规则。
支持的 VARIANT 类型代码
| VARIANT 类型代码 (C/C++) | C/C++ 类型 | 变量类型代码 (Visual Basic) | Visual Basic 类型 | 定义 |
|---|---|---|---|---|
VT_EMPTY | - | vbEmpty | - | 未初始化的 |
VT_I1 | char | - | - | 有符号单字节字符 |
VT_UI1 | 无符号 | vbByte | Byte | 无符号单字节字符 |
VT_I2 | short | vbInteger | Integer | 有符号双字节整数 |
VT_UI2 | unsigned short | - | - | 无符号双字节整数 |
VT_I4 | long | vbLong | Long | 有符号四字节整数 |
VT_UI4 | unsigned long | - | - | 无符号四字节整数 |
VT_R4 | float | vbSingle | Single | IEEE® 四字节浮点值 |
VT_R8 | double | vbDouble | Double | IEEE 八字节浮点值 |
VT_CY | CY+ | vbCurrency | Currency | 货币值(64 位整数,按 10,000 缩放) |
VT_BSTR | BSTR+ | vbString | String | 字符串值 |
VT_ERROR | SCODE+ | vbError | - |
|
VT_DATE | DATE+ | vbDate | Date | 表示日期和时间的八字节浮点值 |
VT_INT | int | - | - | 有符号整数;等同于类型 |
VT_UINT | unsigned int | - | - | 无符号整数;等效于 |
VT_DECIMAL | DECIMAL+ | vbDecimal | - | 96 位(12 字节)无符号整数,按 10 的可变幂缩放 |
VT_BOOL | VARIANT_BOOL+ | vbBoolean | Boolean | 两字节布尔值(0xFFFF = True;0x0000 = False) |
VT_DISPATCH | IDispatch* | vbObject | Object | 指向对象的 |
VT_VARIANT | VARIANT+ | vbVariant | Variant |
|
<任何内容 >|VT_ARRAY | 按位组合 | |||
<任何内容 >|VT_BYREF | 按位组合 | |||
+表示 Windows® 特定类型。不是标准 C/C++ 的一部分。 | ||||
MATLAB 到 COM VARIANT 的转换规则
| MATLAB 数据类型 | 标量数据的 VARIANT 类型 | 数组数据的 VARIANT 类型 | 注释 |
|---|---|---|---|
cell | 1×1 元胞数组转换为单个 | 多维单元元胞数组转换为 | |
structure |
|
| MATLAB |
char | 1×1 | 在 MATLAB 中,假设一个 1×L 的 | 不支持将字符串数组作为 |
sparse |
|
| MATLAB 稀疏数组被转换为 |
double | 实数 1×1 双精度矩阵转换为 | 实数多维双精度矩阵转换为 | 使用 |
single | 实数 1×1 单矩阵转换为 | 实数多维单矩阵转换为 | 使用 |
int8 | 实数 1×1 | 实数多维 | 使用 |
uint8 | 实数 1×1 | 实数多维 | 使用 |
int16 | 实数 1×1 | 实数多维 | 使用 |
uint16 | 实数 1×1 | 实数多维 | 使用 |
int32 | 1×1 | 多维 | 使用 |
uint32 | 1×1 | 多维 | 使用 |
函数句柄 |
|
| 不支持 |
Java® 类 |
|
| 不支持 |
用户类 |
|
| 不支持 |
逻辑值 |
|
|
COM VARIANT 到 MATLAB 的转换规则
| VARIANT 类型 | MATLAB 数据类型(标量或数组数据) | 注释 |
|---|---|---|
VT_EMPTY | N/A | 创建的数组为空。 |
VT_I1 | int8 |
|
VT_UI1 | uint8 |
|
VT_I2 | int16 |
|
VT_UI2 | uint16 |
|
VT_I4 | int32 |
|
VT_UI4 | uint32 |
|
VT_R4 | single |
|
VT_R8 | double |
|
VT_CY | double |
|
VT_BSTR | char |
|
VT_ERROR | int32 |
|
VT_DATE | double |
|
VT_INT | int32 |
|
VT_UINT | uint32 |
|
VT_DECIMAL | double |
|
VT_BOOL | logical |
|
VT_DISPATCH | Varies |
目前,支持 Excel® |
anything|VT_BYREF | Varies | 指向任何基本类型的指针都会根据它们指向的规则进行处理。生成的 MATLAB 数组包含值的深度复制。 |
anything|VT_ARRAY | Varies | 多维 |
数组格式化标志
这些组件具有控制如何在两个方向上格式化数组数据的标志。通常,您应该按照列出的规则开发客户端代码,将 MATLAB 函数的预期输入和输出与编译的 COM 对象上的相应方法相匹配MATLAB 到 COM VARIANT 的转换规则和COM VARIANT 到 MATLAB 的转换规则。在某些情况下这是不可能的,例如当现有的 MATLAB 代码与第三方产品(如 Excel 结合使用时。
下表显示了数组格式标志。
数组格式化标志
| 标志 | 描述 |
|---|---|
| 定义输入数组使用的数组格式规则。
|
| 设置与 |
| 定义输出数组使用的数组格式规则。输出数组是一个 MATLAB 数组,由已编译的 COM 对象创建,作为方法调用的输出参数发送到客户端。此标志的值 |
| (仅适用于嵌套元胞数组。)与 |
| (仅适用于 Excel 范围。)当方法调用的目标输出是 Excel 工作表中的单元格范围,并且在调用时不知道输出数组的大小和形状时,将此标志设置为 |
| 将此标志设置为 |
数据转换标志
MATLAB Compiler SDK 组件包含标志来控制某些 VARIANT 类型到 MATLAB 类型的转换。这些标志如下:
CoerceNumericToType
此标志指示数据转换器将所有数字 VARIANT 数据转换为一种特定的 MATLAB 类型。受此标志影响的 VARIANT 类型代码为 VT_I1、VT_UI1、VT_I2、VT_UI2、VT_I4、VT_UI4、VT_R4、VT_R8、VT_CY、VT_DECIMAL、VT_INT、VT_UINT、VT_ERROR、VT_BOOL 和 VT_DATE。此标志的有效值为 mwTypeDefault、mwTypeChar、mwTypeDouble、mwTypeSingle、mwTypeLogical、mwTypeInt8、mwTypeUint8、mwTypeInt16、mwTypeUint16、mwTypeInt32 和 mwTypeUint32。
此标志的默认值 mwTypeDefault 根据列出的规则转换数字数据数据转换。
InputDateFormat
该标志告诉数据转换器如何将 VARIANT 日期转换为 MATLAB 日期。此标志的有效值为 mwDateFormatNumeric(默认)和 mwDateFormatString。默认按照列出的规则转换 VARIANT 日期支持的 VARIANT 类型代码。mwDateFormatString 标志将 VARIANT 日期转换为其字符串表示形式。此标志仅影响 VARIANT 类型代码 VT_DATE。
OutputAsDate As Boolean
此标志指示数据转换器将输出参量处理为日期。默认情况下,作为编译的 MATLAB 函数的输出参数的数字日期被传递为 Double,需要按 COM 日期偏差(693960)减少并强制转换为 COM 日期。将此标志设置为 True 可转换所有 Double 类型的输出值。
DateBias As Long
此标志设置执行 COM 到 MATLAB 数字日期转换的日期偏差。该属性的默认值为 693960,表示 COM Date 类型和 MATLAB 数字日期之间的差异。此标志允许已执行将数字日期增加 693960 的现有 MATLAB 代码与组件一起不加改变地使用。要使用此类代码处理日期,请将此属性设置为 0。