Re[10]: И снова передача структуры с массивом в unmanaged фу
От:
Аноним
Дата:
28.11.06 07:32
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>Нет, со структурой похоже всё ОК. А>>Тут видимо дело в копировании в массив полученных данных.
А>Что-то в этом супе не то.
А>При попытке копирования данных в managed массив выдаётся ошибка А>Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
А>Причём IntPtr равен 10, т.е. явно такого быть не может.
А>Есть идеи ещё какие-то?
Есть подозрение, что в структуре должен храниться не указатель на массив, а сам массив.
В этом случае, получается примерно следующее:
Вариант I
//на паскале это выглядело бы так
type
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
UDT = record
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(0)]
rxStatus : integer;
[MarshalAs(UnmanagedType.U1)]
[FieldOffset(4)]
datalen : byte;
[FieldOffset(5)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]
data : array[255] of byte;
end;
// на сях видимо будет так
[StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
public struct UDT
{
[MarshalAs(UnmanagedType.U4)]
[FieldOffset(0)]
public int rxStatus;
[MarshalAs(UnmanagedType.U1)]
[FieldOffset(4)]
public byte datalen;
[FieldOffset(5)]
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)]
public byte[255] data;
}
В этом варианте не уверен насчет чтения результата — не совсем ясно кто и выделяет и
и кто должен освобождать память из под возвращаемой функцией структуры