C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 46 を表示中)
■24693 / )  Re[3]: C# COMとのデータ受け渡し
□投稿者/ Hongliang (293回)-(2008/09/08(Mon) 13:36:56)
MSDN の『配列に対する既定のマーシャリング』の記述から、MarshalAs 属性の SizeParamIndex フィールドで要素数を示すパラメータのインデックスを指定できるように読み取れますが、詳しくないのでパスします。
一般的に COM に公開する配列は SafeArray を使用します。これなら SafeArray 自身が要素数を保持しており、.NET のマーシャラも SafeArray による配列のやり取りに対応しているため、UnmanagedType.LPArray な配列のパラメータの要素数を決定できます。要素に独自型を使う場合についてはやっぱり詳しくないのでパス。
先ほど提示した out IntPtr なら、まず「配列の先頭ポインタ」を IntPtr で受け取ります。そして Marshal.ReadIntPtr で先頭要素のポインタを取得します。あとは Marshal.PtrToStructure 辺りで要素のポインタから構造体にコピーします。
配列が NULL 終端されてるなら Marshal.ReadIntPtr で IntPtr.Zero まで読み進めればいい話です。

他の問題として、ポインタを返す場合、そのポインタが指すメモリは誰が解放するのかって点が重要になります。
配列で受けた場合、.NET のマーシャラは渡されたポインタに対し CoTaskMemFree で解放を試みます。勝手に解放を試みられたら困るなら、IntPtr で受けるようにすべきです。
返信 編集キー/


管理者用

- Child Tree -