Когда вы используете COM-объект в команде MATLAB®, 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 |
single | VT_R4 | VT_R4 |
double | VT_R8 | VT_R8 VT_CY |
logical | VT_BOOL | VT_BOOL |
'char' | VT_I1 | VT_I1 VT_UI1 |
variant
является любым типом данных кроме структуры или разреженного массива. (Для получения дополнительной информации смотрите Основной принцип Классы MATLAB.)
Когда используется в качестве входного параметра, MATLAB обрабатывает variant
и variant
(указатель) тот же путь.
Если вы передаете пустой массив ([]
) типа double
, MATLAB создает variant
(указатель) набор к VT_EMPTY
. Передача пустого массива любого другого числового типа не поддержана.
Аргумент MATLAB | Самый близкий тип COM | Позволенные типы |
---|---|---|
variant | VT_VARIANT | VT_VARIANT VT_USERDEFINED VT_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_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 |
| double |
VT_I8 |
| int64 |
VT_UI8 |
| uint64 |
VT_BOOL | logical | |
VT_I1 VT_UI1 | signed char unsigned char | 'char' |
VT_VARIANT VT_USERDEFINED VT_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 читает 3D 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
. Следующий pseudo-code отображает синтаксис MATLAB для вызова метода.
h = actxserver('MyApp'); invoke(h)
Отображения MATLAB:
ans = TestMeth1 = double TestMeth1 (handle)
Подпись TestMeth1
:
double TestMeth1(handle)
MATLAB требует, чтобы вы использовали указатель на объект в качестве входного параметра для каждого метода, в дополнение к любым входным параметрам, требуемым самим методом.
Используйте одну из следующих команд pseudo-code, чтобы создать переменную 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
. Некоторые примеры pseudo-code вызова 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
.