Структура в C ++:
typedef struct _denom
{
CHAR cCurrencyID[3];
int ulAmount;
short usCount;
LPULONG lpulValues; //pointer to array of ULONGS
int ulCashBox;
} DENOMINAT, * LPDENOMINAT;
Структура в C #:
[ StructLayout( LayoutKind.Sequential,
CharSet=CharSet.Ansi, Pack=1 ) ]
public struct DENOMINAT
{
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=3 ) ]
public char[] cCurrencyID;
public int ulAmount;
public short usCount;
public IntPtr lpulValues;
public int ulCashBox;
}
lpulValues
указатель на массив ulongs, размер которого основан на usCount
например: если uscount равен 5, то в C ++ это будет lpulValues = new ULONG[usCount];
,
Я могу легко получить значения массива в C ++, что было невозможно в C #. Я не понимаю, как получить значения массива через IntPtr
,
Заранее спасибо.
Важная вещь
В Windows, в C / C ++, sizeof(long) == sizeof(int)
, Так sizeof(C-long) == sizeof(C#-int)
, Увидеть https://stackoverflow.com/a/9689080/613130
Вы должны быть в состоянии сделать:
var denominat = new DENOMINAT();
var uints = new uint[denominat.usCount];
Marshal.Copy(denominat.lpulValues, (int[])(Array)uints, 0, uints.Length);
Обратите внимание, что мы немного обманываем, бросая uint[]
к int[]
, но это законно, потому что они отличаются только для знака (см. https://stackoverflow.com/a/593799/613130)
Я не думаю, что вы можете сделать это автоматически с .NET PInvoke маршалером.
Чтобы отобразить массив:
for (int i = 0; i < uints.Length; i++)
{
Console.WriteLine(uints[i]);
}