Обработайте COM- Данных в MATLAB

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

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

MATLAB преобразует аргументы MATLAB в типы, которые лучше всего представляют данные в COM-объект. В следующей таблице показаны все базовые типы MATLAB для переданных аргументов и COM-типы, определенные для входных параметров. Каждая строка показывает тип MATLAB, за которым следует возможный аргумент. Описание типов вариантов COM см. в таблице в Handle Data from 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
char VT_I1VT_I1
VT_UI1

Варианты данных

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

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

Если вы передаете пустой массив ([]) типа doubleMATLAB создает 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
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-объект

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

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

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

Пройдите Single-Dimension SAFEARRAY

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

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

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

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

В этом разделе описывается чтение 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-объектов

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