MATLAB での COM データの処理
COM オブジェクトへのデータの受け渡し
MATLAB® コマンドで COM オブジェクトを使用すると、呼び出しで渡した MATLAB のデータ型は COM オブジェクトのネイティブなデータ型に変換されます。MATLAB は渡された引数ごとにこの変換を行います。ここではその変換を説明します。
MATLAB は MATLAB 引数を、COM オブジェクトに対しデータを最も適切に表すデータ型に変換します。次の表は、渡される引数に対するすべての MATLAB の基本データ型と、入力引数に対して定義される COM のデータ型を示します。各行は MATLAB のデータ型の後に、対応する可能な COM 引数を示します。COM バリアント型の詳細は、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(pointer) を同様に処理します。
double 型の空の配列 ([]) を渡すと、MATLAB は VT_EMPTY に設定された variant(pointer) を作成します。その他の数値型の空の配列を渡すことはサポートされていません。
| MATLAB 引数 | 最も近い COM のデータ型 | 許容されるデータ型 |
|---|---|---|
variant | VT_VARIANT | VT_VARIANTVT_USERDEFINEDVT_ARRAY |
variant(pointer) | VT_VARIANT | VT_VARIANT | VT_BYREF |
SAFEARRAY データ
COM メソッドが SAFEARRAY または SAFEARRAY(pointer) を同一に扱う場合、MATLAB の等価のデータは行列になります。
| MATLAB 引数 | 最も近い COM のデータ型 | 許容されるデータ型 |
|---|---|---|
SAFEARRAY | VT_SAFEARRAY | VT_SAFEARRAY |
SAFEARRAY(pointer) | VT_SAFEARRAY | VT_SAFEARRAY | VT_BYREF |
COM オブジェクトからのデータの処理
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(pointer) |
VT_SAFEARRAY |
| SAFEARRAY |
VT_SAFEARRAY | VT_BYREF | SAFEARRAY(pointer) |
サポートされていないデータ型
MATLAB では、次の COM インターフェイスのデータ型はサポートされません。
構造体
スパース配列
多次元配列
SAFEARRAY(2 次元より高い次元)書き込み専用プロパティ
COM オブジェクトへの MATLAB SAFEARRAY の受け渡し
SAFEARRAY データ型は COM オブジェクト間で配列を渡すための標準的な方法です。この節では、MATLAB が SAFEARRAY データを COM オブジェクトに渡す方法について説明します。
MATLAB での既定の動作
MATLAB は m 行 n 列の行列を 2 次元の SAFEARRAY として表します。ここで、最初の次元には m 要素が含まれ、2 番目の次元には n 要素が含まれます。MATLAB は、SAFEARRAY を値で渡します。
例
次の例では、SAFEARRAY 入力パラメーターを予測する COM オブジェクトを使用します。
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
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 次元の SAFEARRAY を 1 行 n 列の行列として COM オブジェクトから読み取ります。
MATLAB は、n 要素をもつ 2 次元の SAFEARRAY を 2 行 n 列の行列として読み取ります。
MATLAB は、2 要素をもつ 3 次元の SAFEARRAY を 2 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)
TestMeth2 は double 型の入力引数 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)
ここで、dret は double、sout は string、dinout は double です (どちらも入力引数および出力引数)。sinout は string (入力引数および出力引数)、ln は int32、b1 は single (入力引数および出力引数)、handle はオブジェクトのハンドル、sh は int16 です。