好きな引数、好きな戻り値が使用できます。Apartmentを超える場合はCOMシステムの仲介によりメソッド呼び出しを実現します。そのため、メソッドにはいくつかの制約があります。戻り値はHRESULTとする。COMシステムでエラーが起こった場合に、対応するHRESULT値を返すためです。引数にデータへのポインタを含む場合は、その内容を明確にCOMシステムに示す。ないと、別のプロセスにデータを渡すことができません。引数に処理(クラスや関数など)へのポインタを含めたい場合は、その呼び出しに対してCOMシステムの介在が必要になるため、決められた方法で渡す。COMの制約として、インターフェース(IUnknown等)へのポインタを渡す場合は、巡回参照が起こらない設計にする必要があります。このように制約はありますが、関数ポインタやCOMでないクラスは渡せないと考えておけば十分でしょう。インターフェースの定義方法まずCOMから離れて、次の関数を考えてみます。数値の配列(data)配列の要素数(num)の2つを用意しています。呼び出し側の疑似コードは、例えば次のようになるでしょう。この関数インターフェースは明確ではありません。set_data()の引数であるdataは、int値を含むポインタを渡しているだけかもしれません。配列であったとしても、その要素数がnumであることはわかりません。*dataに数値をセットして返す関数とも区別できません。配列であれば要素数はいくつであるのか、を明確にする必要があります。引数の前に[]で括った属性を与えられるようになっています。(何も与えない場合はデフォルトの属性が使われます)先ほどの関数では、次のように与えるとその意味が明確になります。data);ここでinやsize_isといった属性が出てきました。これらの意味は次の通りです。この引数は入力である。この引数は出力である。この引数は可変長配列であり、そのサイズはxである。ここで、xは引数を使った計算式です。固定長配列の場合はsize_isを使わずに、要素数つきの配列を引数として渡します。この引数は2次元の可変長配列であり、そのサイズは[x][y]である。この引数は可変長配列であり、そのうち意味のあるデータのサイズはxである。これをふまえて、IIchigo7というCOMのインターフェースを定義する例を示します。この例はそのままmidlでコンパイル可能です。};};ReadBuf()とRead()はいずれもデータ読み込みメソッドです。Read()はバッファ自体をメソッド実装側で確保する例です。Write()はデータ書き出しメソッドの例です。COMシステムと協調して必要なデータの送受信を行えます。次の関数を使うことになっています。pvMem);使い方はC言語のmalloc()、free()と同じです。サンプルコードIIchigo7メソッド実装部分は、例えば次のようになるでしょう。EXEサーバとしても動くようになります。ICHIGO7_SERVER_TYPEをCLSCTX_LOCAL_SERVERとしても動くようになります。