Tengo problemas para seleccionar un puntero a una serie de cadenas. Parece inofensiva como esto:Puntero de mazo a una matriz de cadenas
typedef struct
{
char* listOfStrings[100];
} UnmanagedStruct;
Esto es en realidad incrustado dentro de otra estructura como esta:
typedef struct
{
UnmanagedStruct umgdStruct;
} Outerstruct;
código no administrado llama de nuevo en código administrado y devuelve Outerstruct como IntPtr con memoria asignada y los valores rellenado .
mundo administrado:
[StructLayout(LayoutKind.Sequential)]
public struct UnmanagedStruct
{
[MarshalAs(UnmanagedType.LPArray, ArraySubType=UnmanagedType.LPStr, SizeConst=100)]
public string[] listOfStrings;
}
[StructLayout(LayoutKind.Sequential)]
public struct Outerstruct
{
public UnmanagedStruct ums;
}
public void CallbackFromUnmanagedLayer(IntPtr outerStruct)
{
Outerstruct os = Marshal.PtrToStructure(outerStruct, typeof(Outerstruct));
// The above line FAILS! it throws an exception complaining it cannot marshal listOfStrings field in the inner struct and that its managed representation is incorrect!
}
Si cambio listOfStrings para que sea simplemente un IntPtr, entonces Marshal.PtrToStructure funciona, pero ahora no puedo copiar listOfStrings y extraer las cadenas una a una.
ByValArray == matriz en contexto, LPArray == un puntero a una matriz. Aunque SizeConst aún debería funcionar con un LPArray, entonces el error al calcular referencias fue un poco extraño. –
Oh, eso también debería funcionar si tiene cadena pública [] listOfStrings, es la ByValArray que hace la diferencia, creo. –