[英]how to retrieve values from pointer to array of ULONG in 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
是指向ulong數組的指針,其數組大小基於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]);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.