Moi deklaracje C są następujące:Jak przekazać wskaźnik do wskaźnika tablicy struktur?
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 ;
Moich C deklaracji # przedstawiają się następująco:
[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;
}
I potem wywołać funkcję zarządzanego w sposób następujący:
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);
Po wykonaniu z powyższym Funkcja powróci z powodzeniem tylko z jedną strukturą, nawet jeśli są 3 do powrotu. Dlaczego tak jest?
dodatkowe informacje; Próbowałem przechodzącą wskaźnik do wskaźnika do tablicy kodowanym następujących sposobów:
- ref DATASTRUCT[] data; // Works but only returns one struct
- [Out, MarshalAs(UnmanagedType.LPArray)] DATASTRUCT[] data; // returns the number of defined structs with garbage
Jak rozumiem może muszę zrobić ręcznej rozrządowych korzystając IntPtr
, nie wiem jak zaimplementować to jednak więc każda rada byłaby doceniona.
W jaki sposób funkcja C przypisuje struktury? Czy używa tablicy wejściowej jako bufora, czy generuje nowe struktury z malloc? –
Aha, a także deklaracja C# wygląda źle. Niepodpisany znak nie ma takiego samego rozmiaru jak podwójny (1 do 8 bajtów). –
@JasonLarke, Niestety dokumentacja biblioteki DLL nie określa, czy przydziela pamięć dla struktury czy nie. Zakładam, że tak nie jest. Nie dostarczyłem pełnego opóźnienia dla 'Dane' to w rzeczywistości zmienna char, która może przyjąć maksymalnie 8 bajtów, a więc przyczynę uporządkowania jej jako podwójnej, ta zmienna zdecydowanie zwraca poprawne wyniki za każdym razem Przetestowałem to. – user1470994