Mis C declaraciones son las siguientes:¿Cómo identifico un puntero a un puntero de una matriz de estructuras?
int myData(uint myHandle, tchar *dataName, long *Time, uint *maxData, DATASTRUCT **data);
typedef struct {
byte Rel;
__int64 Time;
char Validated;
unsigned char Data[1];
} DATASTRUCT ;
Mi C# declaraciones son las siguientes:
[DllImport("myData.dll", EntryPoint = "myData")]
public static extern int myData(uint myHandle, [MarshalAs(UnmanagedType.LPTStr)] string dataName, out long Time, out uint maxData, ref DATASTRUCT[] data);
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DATASTRUCT
{
public sbyte Rel;
public long Time;
public byte Validated;
public double Data;
}
entonces llamar a la función administrada de la siguiente manera:
string dataToShow = "description";
long Time;
uint maxData; // How many structs will be returned, i.e. how much data is available
uint myHandle = 1;
DATASTRUCT[] dataInformation = new DATASTRUCT[3]; // doesn't matter what I specify as the array size?
myData(myHandle, dataToShow, out Time, out maxData, ref dataInformation);
Tras la ejecución de lo anterior la función regresará con éxito con solo una estructura aunque haya 3 para regresar. ¿Por qué esto es tan?
Información adicional; He tratado de pasar el puntero a un puntero de una serie de estructuras de las siguientes maneras:
- ref DATASTRUCT[] data; // Works but only returns one struct
- [Out, MarshalAs(UnmanagedType.LPArray)] DATASTRUCT[] data; // returns the number of defined structs with garbage
Según entiendo que podría necesitar hacer un poco de clasificación manual utilizando IntPtr
, no sé cómo implementar esto, sin embargo, entonces cualquier consejo sería apreciado.
¿Cómo está asignando la función C las estructuras? ¿Utiliza la matriz de entrada como un buffer, o genera nuevas estructuras con malloc? –
Ah, y también tu declaración de C# parece incorrecta. Un carácter sin signo no es del mismo tamaño que un doble (1 vs 8 bytes) –
@JasonLarke, Desafortunadamente, la documentación de la biblioteca DLL no indica si asigna memoria para la estructura o no. Estoy asumiendo que no es así. No le proporcioné la desaceleración completa para 'Datos', de hecho es un char variable que puede tomar un máximo de 8 bytes y de ahí la razón detrás de ordenarlo como un doble, esta variable definitivamente devuelve los resultados correctos cada vez Lo he probado – user1470994