При использовании COM-объекта в команде MATLAB ® передаваемые в вызове типы MATLAB преобразуются в типы, собственные для COM-объекта. MATLAB выполняет это преобразование для каждого переданного аргумента. В этом разделе описывается преобразование.
MATLAB преобразует аргументы MATLAB в типы, которые наилучшим образом представляют данные для COM-объекта. В следующей таблице показаны все базовые типы MATLAB для переданных аргументов и типы COM, определенные для входных аргументов. В каждой строке отображается тип MATLAB, за которым следуют возможные совпадения аргументов COM. Описание типов вариантов COM см. в таблице в разделе Обработка данных из объектов COM.
| Аргумент MATLAB | Ближайший тип COM | Разрешенные типы |
|---|---|---|
| ручка | VT_DISPATCHVT_UNKNOWN | VT_DISPATCHVT_UNKNOWN |
| символьный вектор |
VT_BSTR | VT_LPWSTRVT_LPSTRVT_BSTRVT_FILETIMEVT_ERRORVT_DECIMALVT_CLSIDVT_DATE |
int16 |
VT_I2 | VT_I2 |
uint16 | VT_UI2 | VT_UI2 |
int32 | VT_I4 | VT_I4VT_INT |
uint32 | VT_UI4 | VT_UI4VT_UINT |
int64 | VT_I8 | VT_I8 |
uint64 | VT_UI8 | VT_UI8 |
single | VT_R4 | VT_R4 |
double |
VT_R8 | VT_R8VT_CY
|
logical | VT_BOOL
| VT_BOOL |
| случайная работа |
VT_I1 | VT_I1VT_UI1 |
variant - любой тип данных, кроме структуры или разреженного массива. (Дополнительные сведения см. в разделе Основные классы MATLAB.)
При использовании в качестве входного аргумента MATLAB обрабатывает variant и variant(указатель) таким же образом.
При передаче пустого массива ([]) типа double, MATLAB создает variant(указатель) установить на VT_EMPTY. Передача пустого массива любого другого числового типа не поддерживается.
| Аргумент MATLAB | Ближайший тип COM | Разрешенные типы |
|---|---|---|
variant |
VT_VARIANT | VT_VARIANTVT_USERDEFINEDVT_ARRAY |
variant(указатель) | 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_LPWSTRVT_LPSTRVT_BSTRVT_FILETIMEVT_ERRORVT_DECIMALVT_CLSIDVT_DATE
| широкий | символьный вектор |
VT_INTVT_UINTVT_I2VT_UI2VT_I4VT_UI4VT_R4VT_R8VT_CY
|
| double |
VT_I8 |
| int64 |
VT_UI8 |
| uint64 |
VT_BOOL
| logical | |
VT_I1VT_UI1
| signed charunsigned char | случайная работа |
VT_VARIANTVT_USERDEFINEDVT_ARRAY |
| variant |
VT_VARIANT | VT_BYREF
|
| variant(указатель) |
VT_SAFEARRAY | использовать | SAFEARRAY |
VT_SAFEARRAY | VT_BYREF | SAFEARRAY(указатель) |
MATLAB не поддерживает следующие типы COM-интерфейсов.
Структура
Разреженный массив
Многомерный SAFEARRAYs (больше двух размеров)
Свойства только для записи
SAFEARRAY тип данных является стандартным способом передачи массивов между COM-объектами. В этом разделе объясняется, как проходит MATLAB SAFEARRAY данных в COM-объект.
MATLAB представляет mоколо-n матрица как двумерная SAFEARRAY, где первое измерение имеет m элементы и второе измерение имеет n элементы. MATLAB проходит SAFEARRAY по значению.
В следующих примерах используется COM-объект, который ожидает SAFEARRAY входной параметр.
Когда MATLAB проходит 1около-3 массив:
B = [2 3 4]
B =
2 3 4
объект читает:
No. of dimensions: 2 Dim: 1, No. of elements: 1 Dim: 2, No. of elements: 3 Elements: 2.0 3.0 4.0
Когда MATLAB проходит 3около-1 массив:
C = [1;2;3]
C =
1
2
3
объект читает:
No. of dimensions: 2 Dim: 1, No. of elements: 3 Dim: 2, No. of elements: 1 Elements: 1.0 2.0 3.0
Когда MATLAB проходит 2около-4 массив:
D = [2 3 4 5;5 6 7 8]
D =
2 3 4 5
5 6 7 8
объект читает:
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
Дополнительные сведения см. в разделе Как передать аргументы серверу ActiveX из MATLAB 7.0 (R14) в виде одномерных массивов?
Дополнительные сведения см. в разделе Как передать аргументы на сервер ActiveX из MATLAB 7.0 (R14)?
В этом разделе объясняется, как MATLAB читает SAFEARRAY данные из COM-объекта.
MATLAB считывает одномерный SAFEARRAY с n элементы из COM-объекта в качестве 1около-n матрица.
MATLAB считывает двумерный SAFEARRAY с n элементы как 2около-n матрица.
MATLAB считывает трехмерный SAFEARRAY с двумя элементами в качестве 2около-2около-2 массив ячеек.
Чтобы определить, какие типы MATLAB следует использовать при передаче аргументов COM-объектам, используйте invoke или methodsview функции. Эти функции перечисляют все методы, найденные в объекте, а также спецификацию типов, необходимых для каждого аргумента.
Рассмотрим сервер с именем MyApp, который имеет один метод TestMeth1 со следующим синтаксисом:
HRESULT TestMeth1 ([out, retval] double* dret);
Этот метод не имеет входного аргумента и возвращает переменную типа double. Следующий псевдокод отображает синтаксис MATLAB для вызова метода.
h = actxserver('MyApp');
invoke(h)
MATLAB отображает:
ans = TestMeth1 = double TestMeth1 (handle)
Подпись TestMeth1 является:
double TestMeth1(handle)
MATLAB требует использования дескриптора объекта в качестве входного аргумента для каждого метода в дополнение к любым входным аргументам, необходимым для самого метода.
Используйте одну из следующих псевдокодов для создания переменной var, который имеет тип double.
var = h.TestMeth1;
или:
var = TestMeth1(h);
Хотя следующий синтаксис верен, его использование не рекомендуется:
var = invoke(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);
Использование invoke MATLAB отображает список методов:
ans =
TestMeth1 = double TestMeth1 (handle)
TestMeth2 = double TestMeth2 (handle, double)
TestMeth3 = [double, string, double, string, int32, single] ...
TestMeth3(handle, double, string, int16, single)
TestMeth2 требуется входной аргумент d типа doubleи возвращает переменную dret типа double. Некоторые псевдокодовые примеры вызова TestMeth2 являются:
var = h.TestMeth2(5);
или:
var = TestMeth2(h, 5);
TestMeth3 требует нескольких входных аргументов, как указано в скобках на правой стороне знака равенства, и возвращает несколько выходных аргументов, как указано в скобках на левой стороне знака равенства.
[double, string, double, string, int32, single] %output arguments TestMeth3(handle, double, string, int16, single) %input arguments
Первый входной аргумент является обязательным handle, за которым следуют четыре входных аргумента.
TestMeth3(handle, in1, in2, in3, in4)
Первым выходным аргументом является возвращаемое значение retval, за которыми следуют пять выходных аргументов.
[retval, out1, out2, out3, out4, out5]
Вот как аргументы сопоставляются с командой MATLAB:
[dret, sout, dinout, sinout, ln, b1] = TestMeth3(handle, ...
dinout, sinout, sh, b1)
где dret является double, sout является string, dinout является double и является как входным, так и выходным аргументом, sinout является string (входной и выходной аргумент), ln является int32, b1 является single (входной и выходной аргумент), handle является дескриптором объекта, и sh является int16.