В этом разделе описываются правила преобразования данных для COM-компонентов, созданных с помощью продукта MATLAB ® Compiler SDK™. Эти компоненты представляют собой объекты COM с двумя интерфейсами, поддерживающие типы данных, совместимые с Automation.
Примечание
Автоматизация (ранее называвшаяся OLE Automation) - технология, позволяющая пакетам программного обеспечения предоставлять свои уникальные функции инструментам создания сценариев и другим приложениям. Автоматизация использует объектную модель компонента (COM), но может быть реализована независимо от других функций OLE, таких как активация на месте.
Внимание
Помните, что IIS (Internet Information Service) обычно предотвращает автоматизацию большинства COM, поскольку она может представлять угрозу безопасности. Поэтому XLSREAD и другие службы автоматизации могут отказывать при обслуживании IIS, что приводит к таким ошибкам, как object reference not set.
При вызове метода в компоненте MATLAB Compiler SDK входные параметры преобразуются в формат внутреннего массива MATLAB и передаются в скомпилированную функцию MATLAB. При выходе из функции выходные параметры преобразуются из формата внутреннего массива MATLAB в типы COM Automation.
COM-клиент передает все входные и выходные аргументы в скомпилированных функциях MATLAB как тип VARIANT. COM VARIANT type - это объединение нескольких простых типов данных. Тип VARIANT переменная может хранить переменную любого из простых типов, а также массивы любого из этих значений.
API Win32 предоставляет множество функций для создания и управления VARIANTs в C/C + +, и Microsoft ® Visual Basic ® обеспечивает поддержку этого типа на родном языке. Определения и поддержку API для COM см. в документации по Microsoft Visual Studio ®VARIANTs. VARIANT переменные являются самоописанием и сохраняют код типа в качестве внутреннего поля структуры.
Примечание
Это обсуждение данных относится к обоим VARIANT и Variant типы данных. VARIANT - имя C++ и Variant - соответствующий тип данных в Visual Basic.
Список поддерживаемых кодов типа VARIANT см. в разделе «Поддерживаемые коды типа VARIANT» VARIANT коды типов, поддерживаемые компонентами компилятора.
См. правила преобразования MATLAB в COM VARIANT и правила преобразования COM VARIANT в MATLAB для правил преобразования между COM VARIANTмассивы s и MATLAB.
Поддерживаемые коды типа VARIANT
| Код типа VARIANT (C/C + +) | Тип C/C + + | Код типа варианта (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 = ложь) |
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 | A 1 на 1 | А 1-by-L | Массивы строк не поддерживаются как |
sparse |
|
| Разреженный массив MATLAB преобразуется в |
double | Вещественная двойная матрица 1 на 1 преобразуется в | Вещественная многомерная двойная матрица преобразуется в | Сложные массивы передаются в и из скомпилированных функций MATLAB с помощью |
single | Вещественная единичная матрица 1 на 1 преобразуется в | Действительная многомерная единичная матрица преобразуется в | Сложные массивы передаются в и из скомпилированных функций MATLAB с помощью |
int8 | Вещественный 1 за 1 | Настоящая многомерность | Сложные массивы передаются в и из скомпилированных функций MATLAB с помощью |
uint8 | Вещественный 1 за 1 | Настоящая многомерность | Сложные массивы передаются в и из скомпилированных функций MATLAB с помощью |
int16 | Вещественный 1 за 1 | Настоящая многомерность | Сложные массивы передаются в и из скомпилированных функций MATLAB с помощью |
uint16 | Вещественный 1 за 1 | Настоящая многомерность | Сложные массивы передаются в и из скомпилированных функций MATLAB с помощью |
int32 | A 1 на 1 | Многомерное | Сложные массивы передаются в и из скомпилированных функций MATLAB с помощью |
uint32 | A 1 на 1 | Многомерное | Сложные массивы передаются в и из скомпилированных функций MATLAB с помощью |
Дескриптор функции |
|
| Не поддерживается |
Класс Java ® |
|
| Не поддерживается |
Класс пользователя |
|
| Не поддерживается |
логичный |
|
|
Правила преобразования COM VARIANT в MATLAB
| Тип VARIANT | Тип данных MATLAB (скалярные данные или данные массива) | Комментарии |
|---|---|---|
VT_EMPTY | Н/Д | Создан пустой массив. |
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 | A |
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, а размер и форма выходного массива не известны во время вызова, установите этот флаг в значение |
| Установить этот флаг в значение |
Компоненты SDK компилятора MATLAB содержат флаги для управления преобразованием определенных VARIANT типы для типов MATLAB. Эти флаги следующие:
Этот флаг сообщает преобразователю данных, чтобы преобразовать все числовые 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преобразует числовые данные в соответствии с правилами, перечисленными в окне «Преобразование данных».
Этот флаг сообщает конвертеру данных, как преобразовать VARIANT даты к датам MATLAB. Допустимые значения для этого флага: mwDateFormatNumeric (по умолчанию) и mwDateFormatString. Преобразование по умолчанию VARIANT даты в соответствии с правилом, перечисленным в разделе Поддерживаемые коды типа VARIANT. mwDateFormatString флаг преобразует VARIANT датируется строковым представлением. Этот флаг влияет только на VARIANT код типа VT_DATE.
Этот флаг предписывает преобразователю данных обработать выходной аргумент как дату. По умолчанию числовые даты, являющиеся выходными параметрами скомпилированных функций MATLAB, передаются как Doubles, которые должны быть уменьшены смещением даты COM (693960), а также принуждены к датам COM. Установить этот флаг в значение True преобразование всех выходных значений типа Double.
Этот флаг устанавливает смещение даты для выполнения преобразования чисел COM в MATLAB. Значение этого свойства по умолчанию - 693960, что представляет разницу между COM Date числовые даты типа и MATLAB. Этот флаг позволяет использовать существующий код MATLAB, который уже выполняет приращение числовых дат на 693960, без изменений для компонентов. Чтобы обработать даты с таким кодом, установите для этого свойства значение 0.