Как получить значения из указателя на массив ULONG в C #

Структура в 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,
Заранее спасибо.

0

Решение

Важная вещь

В 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]);
}
2

Другие решения


По вопросам рекламы [email protected]