Cómo convertir un IntPtr en un array de structs
Tengo un IntPtr que es un puntero a un array de estructuras, y estoy tratando de convertirlo en un array.
He intentado
Marshal.Copy(srcIntPtr, destIntPtrArray, 0, destIntPtrArray.Length);
pero después de hacer la copia, no puedo convertir los IntPtr dentro del array de destino a la estructura deseada, mientras que puedo convertir el srcIntPtr a la estructura, lo cual por supuesto solo me da los datos del primer índice. Parece que después de hacer la copia, el array de destino contiene un montón de IntPtr rotos.
También he intentado
var size = Marshal.SizeOf(Marshal.ReadIntPtr(myIntPtr));
for (int i = 0; i < length; i++)
{
IntPtr iP = new IntPtr(myIntPtr.ToInt64() + i * size);
MyStruct ms =
(MyStruct)Marshal.PtrToStructure(iP, typeof(MyStruct));
}
que no muestra ningún error, pero los datos del array de estructuras que obtengo de mi source IntPtr no son precisos.
Esta es la estructura a la que estoy tratando de convertir:
struct MyStruct
{
public Categories categories;
public Dimensions dimensions;
}
public struct Categories {
public double d;
public double c;
public double b;
public double a;
}
struct Dimensions {
public double v;
public double e;
}
Tengo [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
en la parte superior de las estructuras, pero eliminar eso no rompe mi código.
Gracias de antemano.
davy.ai
Parece que puede haber un problema con la forma en que se crea o accede al conjunto de estructuras después de la copia de IntPtr. Un enfoque para probar sería crear una nueva instancia del conjunto de estructuras y luego iterar a través del conjunto de IntPtr y utilizar Marshal.PtrToStructure para poblar cada elemento del conjunto de estructuras. Aquí tienes un ejemplo:
Esto creará un nuevo conjunto de MyStruct y poblará cada elemento con datos del conjunto original de IntPtr. Si aún hay problemas con los datos que no son precisos, podría valer la pena comprobar si el conjunto original de IntPtr se está utilizando correctamente en otros lugares del código, o si hay alguna incompatibilidad entre las definiciones de las estructuras y los datos en el conjunto de IntPtr.