Ich versuche, ein Array der RECT-Struktur (siehe unten) in eine IntPtr zu konvertieren, damit ich den Zeiger mit PostMessage an eine andere Anwendung senden kann.Konvertieren Array von Strukturen zu IntPtr
[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
Dieses ein Argument in der letzten Zeile gibt („Die angegebene Struktur muss blitfähig sein oder Layout-Informationen haben.“). Ich muss irgendwie dieses Array von RECTs mit PostMessage auf eine andere Anwendung übertragen, also brauche ich wirklich einen Zeiger auf diese Daten.
Was sind meine Optionen hier?
UPDATE: Dies scheint zu funktionieren:
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)));
}
WIEDER AKTUALISIERT zu beheben, was Schiedsrichter kommentiert.
Welche Botschaft Mitteilung verfassen Sie das tut automatisch Cross-Prozess Serialisieren einer Anordnung von 4 Rects? –
Ich versuche, eine DLL (die in einem anderen Prozess gehostet wird, weil es 64-Bit ist) zu bestimmten Bereichen des Bildschirms zu ignorieren. Es sind nicht unbedingt 4 RECTs. –
Entsprechend Ihrer Aktualisierung, Sie nicht genügend Speicherplatz zuweisen (intptr.size anstelle von Marshal.SizeOf (typeof (RECT))). Und die Zeigerarithmetik kann auf x64-Maschinen fehlschlagen, siehe meine Antwort. – arbiter