exponenta event banner

Обработка COM-данных в MATLAB

Передача данных в COM-объекты

При использовании 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_BSTRVT_LPWSTR
VT_LPSTR
VT_BSTR
VT_FILETIME
VT_ERROR
VT_DECIMAL
VT_CLSID
VT_DATE
int16 VT_I2VT_I2
uint16VT_UI2VT_UI2
int32VT_I4VT_I4
VT_INT
uint32VT_UI4VT_UI4
VT_UINT
int64VT_I8VT_I8
uint64VT_UI8VT_UI8
singleVT_R4VT_R4
double VT_R8VT_R8
VT_CY
logicalVT_BOOL VT_BOOL
случайная работа VT_I1VT_I1
VT_UI1

Данные варианта

variant - любой тип данных, кроме структуры или разреженного массива. (Дополнительные сведения см. в разделе Основные классы MATLAB.)

При использовании в качестве входного аргумента MATLAB обрабатывает variant и variant(указатель) таким же образом.

При передаче пустого массива ([]) типа double, MATLAB создает variant(указатель) установить на VT_EMPTY. Передача пустого массива любого другого числового типа не поддерживается.

Аргумент MATLABБлижайший тип COMРазрешенные типы
variant VT_VARIANTVT_VARIANT
VT_USERDEFINED
VT_ARRAY
variant(указатель)VT_VARIANTVT_VARIANT | VT_BYREF

Данные SAFEARRAY

Когда COM-метод идентифицирует SAFEARRAY или SAFEARRAY(указатель), эквивалент MATLAB является матрицей.

Аргумент MATLABБлижайший тип COMРазрешенные типы
SAFEARRAYVT_SAFEARRAYVT_SAFEARRAY
SAFEARRAY(указатель) VT_SAFEARRAYVT_SAFEARRAY | VT_BYREF

Обработка данных из COM-объектов

Данные, возвращаемые COM-объектом, часто несовместимы с типами MATLAB. Когда это происходит, MATLAB преобразует возвращаемое значение в тип данных, собственный языку MATLAB. В этом разделе описывается преобразование, выполняемое для различных типов, которые могут быть возвращены из COM-объектов.

В следующей таблице показано, как MATLAB преобразует данные из COM-объекта в переменные MATLAB.

Тип варианта COM

Описание

Представление MATLAB

VT_DISPATCH

IDispatch *

ручка
VT_LPWSTR
VT_LPSTR
VT_BSTR
VT_FILETIME
VT_ERROR
VT_DECIMAL
VT_CLSID
VT_DATE

широкий null завершенная строка
null завершенная строка
Строка автоматизации OLE
FILETIME
SCODE
16-байтовая фиксированная точка
Идентификатор класса
дата

символьный вектор
VT_INT
VT_UINT
VT_I2
VT_UI2
VT_I4
VT_UI4
VT_R4
VT_R8
VT_CY

signed machine int
unsigned machine int
2-байтовый signed int
unsigned short
4-байтовый signed int
unsigned long
4-байтовый real
8-байтовый real
валюта

double
VT_I8

signed int64

int64
VT_UI8

unsigned int64

uint64
VT_BOOL  logical
VT_I1
VT_UI1
signed char
unsigned char
случайная работа
VT_VARIANT
VT_USERDEFINED
VT_ARRAY

VARIANT *
определяемый пользователем тип
SAFEARRAY*

variant
VT_VARIANT | VT_BYREF

VARIANT *
void* для локального использования

variant(указатель)
VT_SAFEARRAY

использовать VT_ARRAY в VARIANT

SAFEARRAY
VT_SAFEARRAY | VT_BYREF SAFEARRAY(указатель)

Неподдерживаемые типы

MATLAB не поддерживает следующие типы COM-интерфейсов.

  • Структура

  • Разреженный массив

  • Многомерный SAFEARRAYs (больше двух размеров)

  • Свойства только для записи

Передача MATLAB SAFEARRAY объекту COM

SAFEARRAY тип данных является стандартным способом передачи массивов между COM-объектами. В этом разделе объясняется, как проходит MATLAB SAFEARRAY данных в COM-объект.

Поведение по умолчанию в MATLAB

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

Пройти одномерный SAFEARRAY

Дополнительные сведения см. в разделе Как передать аргументы серверу ActiveX из MATLAB 7.0 (R14) в виде одномерных массивов?

Пройти SAFEARRAY по ссылке

Дополнительные сведения см. в разделе Как передать аргументы на сервер ActiveX из MATLAB 7.0 (R14)?

Читать SAFEARRAY из объектов COM в приложениях MATLAB

В этом разделе объясняется, как MATLAB читает SAFEARRAY данные из COM-объекта.

MATLAB считывает одномерный SAFEARRAY с n элементы из COM-объекта в качестве 1около-n матрица.

MATLAB считывает двумерный SAFEARRAY с n элементы как 2около-n матрица.

MATLAB считывает трехмерный SAFEARRAY с двумя элементами в качестве 2около-2около-2 массив ячеек.

Отображение синтаксиса MATLAB для объектов COM

Чтобы определить, какие типы 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.