Когда вы используете 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 |
единственный | VT_R4 | VT_R4 |
'double' | VT_R8 | VT_R8VT_CY |
логический | VT_BOOL | VT_BOOL |
| 'char' | 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 | логический | |
VT_I1VT_UI1 | signed charunsigned char | 'char' |
VT_VARIANTVT_USERDEFINEDVT_ARRAY |
| variant |
VT_VARIANT | VT_BYREF
|
| variant (указатель) |
VT_SAFEARRAY | используйте | SAFEARRAY |
VT_SAFEARRAY | VT_BYREF | SAFEARRAY (указатель) |
MATLAB не поддерживает следующие типы COM-интерфейса и отображает предупреждение ActiveX - unsupported VARIANT type encountered.
Структура
Разреженный массив
Многомерный SAFEARRAY s (больше, чем две размерности)
Свойства только для записи
Таблицы также показывают отображение типов MATLAB к типам COM, что необходимо использовать, чтобы передать данные от MATLAB до объекта Microsoft® ActiveX®. Для всех других типов MATLAB отображает предупреждение ActiveX - invalid argument type or value.
Тип данных SAFEARRAY является стандартным способом передать массивы между COM-объектами. Этот раздел объясняет, как MATLAB передает данные SAFEARRAY COM-объекту.
MATLAB представляет m-by-n матрица как двумерный SAFEARRAY, где первая размерность имеет элементы m, и второе измерение имеет элементы n. MATLAB передает SAFEARRAY значением.
Следующие примеры используют COM-объект, который ожидает входной параметр SAFEARRAY.
Когда MATLAB передает 1-by-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-by-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-by-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-by-n матрица. Например, использование методов от выборки MATLAB управляет mwsamp, вводит:
h=actxcontrol('mwsamp.mwsampctrl.1')
a = GetI4Vector(h)
Отображения MATLAB:
a =
1 2 3
MATLAB читает двумерный SAFEARRAY с элементами n как 2-by-n матрица. Например:
a = GetR8Array(h)
Отображения MATLAB:
a =
1 2 3
4 5 6
MATLAB читает трехмерный SAFEARRAY с двумя элементами как 2-by-2-by-2 массив ячеек. Например:
a = GetBSTRArray(h)
Отображения MATLAB:
a(:,:,1) =
'1 1 1' '1 2 1'
'2 1 1' '2 2 1'
a(:,:,2) =
'1 1 2' '1 2 2'
'2 1 2' '2 2 2'
Чтобы определить который типы MATLAB использовать когда передающие аргументы для COM-объектов, используйте функции methodsview или invoke. Эти функции перечисляют все методы, найденные в объекте, наряду со спецификацией типов, требуемых для каждого аргумента.
Рассмотрите сервер под названием 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.