Main Content

MATLAB での COM データの処理

COM オブジェクトへのデータの受け渡し

MATLAB® コマンドで COM オブジェクトを使用すると、呼び出しで渡した 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
char VT_I1VT_I1
VT_UI1

バリアント データ

variant には、構造体またはスパース配列を除く任意のデータ型を指定できます (詳細は、MATLAB の基本クラスを参照してください)。

入力引数として使用される場合、MATLAB は variantvariant(pointer) を同様に処理します。

double 型の空の配列 ([]) を渡すと、MATLAB は VT_EMPTY に設定された variant(pointer) を作成します。その他の数値型の空の配列を渡すことはサポートされていません。

MATLAB 引数最も近い COM のデータ型許容されるデータ型
variant VT_VARIANTVT_VARIANT
VT_USERDEFINED
VT_ARRAY
variant(pointer)VT_VARIANTVT_VARIANT | VT_BYREF

SAFEARRAY データ

COM メソッドが SAFEARRAY または SAFEARRAY(pointer) を同一に扱う場合、MATLAB の等価のデータは行列になります。

MATLAB 引数最も近い COM のデータ型許容されるデータ型
SAFEARRAYVT_SAFEARRAYVT_SAFEARRAY
SAFEARRAY(pointer) 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  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(pointer)
VT_SAFEARRAY

VARIANT では VT_ARRAY を使用

SAFEARRAY
VT_SAFEARRAY | VT_BYREF SAFEARRAY(pointer)

サポートされていないデータ型

MATLAB では、次の COM インターフェイスのデータ型はサポートされません。

  • 構造体

  • スパース配列

  • 多次元配列 SAFEARRAY (2 次元より高い次元)

  • 書き込み専用プロパティ

COM オブジェクトへの MATLAB SAFEARRAY の受け渡し

SAFEARRAY データ型は COM オブジェクト間で配列を渡すための標準的な方法です。この節では、MATLAB が SAFEARRAY データを COM オブジェクトに渡す方法について説明します。

MATLAB での既定の動作

MATLAB は mn 列の行列を 2 次元の SAFEARRAY として表します。ここで、最初の次元には m 要素が含まれ、2 番目の次元には n 要素が含まれます。MATLAB は、SAFEARRAY を値で渡します。

次の例では、SAFEARRAY 入力パラメーターを予測する COM オブジェクトを使用します。

MATLAB が 13 列の配列を渡す場合:

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 が 31 列の配列を渡す場合:

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 が 24 列の配列を渡す場合:

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

1 次元 SAFEARRAY の受け渡し

詳細については、How can I pass arguments to an ActiveX server from MATLAB 7.0 (R14) as one-dimensional arrays? を参照してください。

SAFEARRAY の参照渡し

詳細については、How can I pass arguments by reference to an ActiveX server from MATLAB 7.0 (R14)? を参照してください。

MATLAB アプリケーションでの COM オブジェクトからの SAFEARRAY の読み取り

この節では、MATLAB が COM オブジェクトから SAFEARRAY データを読み取る方法について説明します。

MATLAB は、n 要素をもつ 1 次元の SAFEARRAY1n 列の行列として COM オブジェクトから読み取ります。

MATLAB は、n 要素をもつ 2 次元の SAFEARRAY2n 列の行列として読み取ります。

MATLAB は、2 要素をもつ 3 次元の SAFEARRAY2 x 2 x 2 の cell 配列として読み取ります。

COM オブジェクトの MATLAB 構文の表示

引数を COM オブジェクトに渡す際に、MATLAB のどのデータ型を使用するかは、関数 invoke または関数 methodsview を使用して決定します。これらの関数は、オブジェクトにあるすべてのメソッドと各引数に必要な型の仕様をリストします。

MyApp という名前のサーバーを考えます。このサーバーには、次の構文をもつメソッド TestMeth1 が 1 つだけあります。

HRESULT TestMeth1 ([out, retval] double* dret);

このメソッドは入力引数をもたず、double 型の変数を返します。次の疑似コードは、このメソッドを呼び出す MATLAB の構文を表示します。

h = actxserver('MyApp');
invoke(h)

MATLAB に以下のように表示されます。

ans = 
   TestMeth1 = double TestMeth1 (handle)

TestMeth1 のシグネチャは以下のとおりです。

double TestMeth1(handle)

MATLAB では、メソッド自体で必要な入力引数に加えて、各メソッドの入力引数としてオブジェクト ハンドルを使用しなければなりません。

以下の疑似コードコマンドのいずれかを使用して、double 型の変数 var を作成します。

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)

TestMeth2double 型の入力引数 d を必要とし、double 型の変数 dret を返します。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 であり、この後に 4 つの入力引数が続きます。

TestMeth3(handle, in1, in2, in3, in4)

最初の出力引数は戻り値 retval であり、この後に 5 つの出力引数が続きます。

[retval, out1, out2, out3, out4, out5]

MATLAB コマンドに引数をマップする方法を次に示します。

[dret, sout, dinout, sinout, ln, b1] = TestMeth3(handle, ...
                                       dinout, sinout, sh, b1)

ここで、dretdoublesoutstringdinoutdouble です (どちらも入力引数および出力引数)。sinoutstring (入力引数および出力引数)、lnint32b1single (入力引数および出力引数)、handle はオブジェクトのハンドル、shint16 です。