Convert array of structs to IntPtr
.net, c#, marshalling
Solution
StructureToPtr expects struct object, and foo is not structure it is array, that is why exception occurs.
I can suggest you to write structures in cycle (sadly, StructureToPtr does not have overload with Index):
long LongPtr = ptr.ToInt64(); // Must work both on x86 and x64
for (int I = 0; I < foo.Length; I++)
{
IntPtr RectPtr = new IntPtr(LongPtr);
Marshal.StructureToPtr(foo[I], RectPtr, false); // You do not need to erase struct in this case
LongPtr += Marshal.SizeOf(typeof(Rect));
}
Another option is to write structure as four integers, using Marshal.WriteInt32:
for (int I = 0; I < foo.Length; I++)
{
int Base = I * sizeof(int) * 4;
Marshal.WriteInt32(ptr, Base + 0, foo[I].Left);
Marshal.WriteInt32(ptr, Base + sizeof(int), foo[I].Top);
Marshal.WriteInt32(ptr, Base + sizeof(int) * 2, foo[I].Right);
Marshal.WriteInt32(ptr, Base + sizeof(int) * 3, foo[I].Bottom);
}
And the last, you can use unsafe keyword, and work with pointers directly.
Problem
I am trying to convert an array of the RECT structure (given below) into an IntPtr, so I can send the pointer using PostMessage to another application. ``` [StructLayout(LayoutKind.Sequential)] public struct RECT { public int Left; public int Top; public int Right; public int Bottom; // lots of functions snipped here } // so we have something to send, in reality I have real data here // also, the length of the array is not constant RECT[] foo = new RECT[4]; IntPtr ptr = Marshal.AllocHGlobal(Marshal.SizeOf(foo[0]) * 4); Marshal.StructureToPtr(foo, ptr, true); // -- FAILS ``` This gives an ArgumentException on the last line ("The specified structure must be blittable or have layout information."). I need to somehow get this array of RECTs over to another application using PostMessage, so I really need a pointer to this data. What are my options here? UPDATE: This seems to work: ``` IntPtr result = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(Win32.RECT)) * foo.Length); IntPtr c = new IntPtr(result.ToInt32()); for (i = 0; i < foo.Length; i++) { Marshal.StructureToPtr(foo[i], c, true); c = new IntPtr(c.ToInt32() + Marshal.SizeOf(typeof(Win32.RECT))); } ``` UPDATED AGAIN to fix what arbiter commented on.