Обработка данных 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
единственныйVT_R4VT_R4
'double' VT_R8VT_R8
VT_CY
логическийVT_BOOL VT_BOOL
'char' 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-байтовая фиксированная точка
ID класса
дата

символьный вектор
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  логический
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-интерфейса и отображает предупреждение ActiveX - unsupported VARIANT type encountered.

  • Структура

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

  • Многомерный SAFEARRAY s (больше, чем две размерности)

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

Передающие данные MATLAB к объектам ActiveX

Таблицы также показывают отображение типов MATLAB к типам COM, что необходимо использовать, чтобы передать данные от MATLAB до объекта Microsoft® ActiveX®. Для всех других типов MATLAB отображает предупреждение ActiveX - invalid argument type or value.

Переход MATLAB SAFEARRAY к COM-объекту

Тип данных 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

Как передать Единственную Размерность 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 управляет 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-объектов

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

Была ли эта тема полезной?