|
■No78755 (魔界の仮面弁士) に追記 >> List<T>型をLPARAM型に変換する必要があり、 > しかし、それをどのように変換するべきは、それを中継する相手が > LPARAM をどのように扱うかによって異なります。 > > その変換を必要としている背景について、もう少し詳しく書くことはできますか?
単純コピーなコードを書いてみました。T は構造体限定です。 型によっては変換結果を保証できない場合もあります。
static IntPtr ToLPARAM<T>(List<T> list) where T : struct { int typeSize = Marshal.SizeOf<T>(); int intSize = Marshal.SizeOf<int>(); int size = intSize + typeSize * list.Count;
IntPtr ptr = Marshal.AllocCoTaskMem(size); Marshal.WriteInt32(ptr, list.Count); for (int i = 0; i < list.Count; i++) { int offset = intSize + typeSize * i; IntPtr p = IntPtr.Add(ptr, offset); Marshal.StructureToPtr(list[i], p, false); } return ptr; }
static List<T> FromLPARAM<T>(IntPtr ptr, bool withRelease) where T : struct { int typeSize = Marshal.SizeOf<T>(); int intSize = Marshal.SizeOf<int>(); int count = Marshal.ReadInt32(ptr);
List<T> list = new List<T>(); for (int i = 0; i < count; i++) { int offset = intSize + typeSize * i; IntPtr p = IntPtr.Add(ptr, offset); list.Add(Marshal.PtrToStructure<T>(p)); } if(withRelease) { Marshal.FreeCoTaskMem(ptr); } return list; }
|