Tôi đang cố gắng chuyển đổi một mảng cấu trúc RECT (được đưa ra dưới đây) thành IntPtr, vì vậy tôi có thể gửi con trỏ bằng cách sử dụng PostMessage đến một ứng dụng khác.Chuyển đổi mảng cấu trúc thành 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
Điều này mang lại cho một ArgumentException trên dòng cuối cùng ("Cấu trúc được chỉ định phải có thể ghi được hoặc có thông tin bố cục"). Tôi cần bằng cách nào đó lấy mảng RECT này cho một ứng dụng khác bằng cách sử dụng PostMessage, vì vậy tôi thực sự cần một con trỏ tới dữ liệu này.
Tùy chọn của tôi ở đây là gì?
CẬP NHẬT: Điều này dường như làm việc:
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)));
}
CẬP NHẬT LẠI để sửa chữa những gì trọng tài nhận xét về.
nhắn bạn gửi bài tự động thực hiện quá trình cross-marshaling của một mảng của 4 dễ phân biệt gì? –
Tôi đang cố gắng nói với một DLL (được lưu trữ trong một tiến trình khác vì nó là 64-bit) để bỏ qua các vùng nhất định của màn hình. Nó không nhất thiết phải là 4 RECT. –
Theo cập nhật của bạn, bạn không phân bổ đủ không gian (intptr.size thay vì Marshal.SizeOf (typeof (RECT))). Và con trỏ số học có thể thất bại trên máy x64, xem câu trả lời của tôi. – arbiter