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_BSTR | VT_LPWSTR VT_LPSTR VT_BSTR VT_FILETIME VT_ERROR VT_DECIMAL VT_CLSID VT_DATE |
int16 | VT_I2 | VT_I2 |
uint16 | VT_UI2 | VT_UI2 |
int32 | VT_I4 | VT_I4 VT_INT |
uint32 | VT_UI4 | VT_UI4 VT_UINT |
int64 | VT_I8 | VT_I8 |
uint64 | VT_UI8 | VT_UI8 |
single | VT_R4 | VT_R4 |
double | VT_R8 | VT_R8 VT_CY |
logical | VT_BOOL | VT_BOOL |
char | VT_I1 | VT_I1 VT_UI1 |
バリアント データ
variant
には、構造体またはスパース配列を除く任意のデータ型を指定できます (詳細は、MATLAB の基本クラスを参照してください)。
入力引数として使用される場合、MATLAB は variant
と variant
(pointer) を同様に処理します。
double
型の空の配列 ([]
) を渡すと、MATLAB は VT_EMPTY
に設定された variant
(pointer) を作成します。その他の数値型の空の配列を渡すことはサポートされていません。
MATLAB 引数 | 最も近い COM のデータ型 | 許容されるデータ型 |
---|---|---|
variant | VT_VARIANT | VT_VARIANT VT_USERDEFINED VT_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_LPWSTR VT_LPSTR VT_BSTR VT_FILETIME VT_ERROR VT_DECIMAL VT_CLSID VT_DATE |
| 文字ベクトル |
VT_INT VT_UINT VT_I2 VT_UI2 VT_I4 VT_UI4 VT_R4 VT_R8 VT_CY |
| double |
VT_I8 |
| int64 |
VT_UI8 |
| uint64 |
VT_BOOL | logical | |
VT_I1 VT_UI1 | signed char unsigned char | char |
VT_VARIANT VT_USERDEFINED VT_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
です。