Когда вы используете COM-объект в MATLAB® команды, типы MATLAB, которые вы передаете в вызове, преобразуются в типы, входящие в COM-объект. MATLAB выполняет это преобразование для каждого переданного аргумента. В этом разделе описывается преобразование.
MATLAB преобразует аргументы MATLAB в типы, которые лучше всего представляют данные в COM-объект. В следующей таблице показаны все базовые типы MATLAB для переданных аргументов и COM-типы, определенные для входных параметров. Каждая строка показывает тип MATLAB, за которым следует возможный аргумент. Описание типов вариантов COM см. в таблице в Handle Data from 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 |
| char |
VT_I1 | VT_I1VT_UI1 |
variant - любой тип данных, кроме структуры или разреженного массива. (Для получения дополнительной информации см. «Фундаментальные классы MATLAB».)
При использовании в качестве входного параметра MATLAB обработок variant и variant(указатель) так же.
Если вы передаете пустой массив ([]) типа doubleMATLAB создает 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 | char |
VT_VARIANTVT_USERDEFINEDVT_ARRAY |
| variant |
VT_VARIANT | VT_BYREF
|
| variant(указатель) |
VT_SAFEARRAY | использовать | SAFEARRAY |
VT_SAFEARRAY | VT_BYREF | SAFEARRAY(указатель) |
MATLAB не поддерживает следующие типы COM-интерфейсов.
Структура
Разреженный массив
Многомерные SAFEARRAYs (больше двух измерений)
Свойства только для записи
The 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 читает двумерное SAFEARRAY с n элементы как 2-by- n матрица.
MATLAB читает трехмерное SAFEARRAY с двумя элементами в виде 2-by- 2-by- 2 массив ячеек.
Чтобы определить, какие типы MATLAB использовать при передаче аргументов COM-объектам, используйте invoke или methodsview функций. Эти функции перечисляют все методы, найденные в объекте, а также спецификацию типов, необходимых для каждого аргумента.
Рассмотрим сервер, вызываемый 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 function, 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.