C# 当我通过pinvoke获得第一个元素时,如何获取数组中的下一项?
我使用的api的方法定义如下:C# 当我通过pinvoke获得第一个元素时,如何获取数组中的下一项?,c#,pinvoke,C#,Pinvoke,我使用的api的方法定义如下: [DllImport("icsneo40.dll")] public static extern Int32 icsneoGetMessages(Int32 hObject, ref icsSpyMessage pMsg, ref Int32 pNumberOfMessages, ref Int32 pNumberOfErrors); 使用icsSpyMessage参数描述为: pMsg[out] 这是数组的第一个元素的地址 icsSpyMes
[DllImport("icsneo40.dll")]
public static extern Int32 icsneoGetMessages(Int32 hObject, ref icsSpyMessage pMsg, ref Int32 pNumberOfMessages, ref Int32 pNumberOfErrors);
使用icsSpyMessage
参数描述为:
pMsg[out]这是数组的第一个元素的地址 icsSpyMessage结构。此数组将加载 硬件接收到的消息。此阵列的大小必须适合 20000 icsSpyMessage结构
我的问题是,当我只有第一个元素时,如何访问数组中的其他元素?既然要传递数组,那么应该将
icsSpyMessage
声明为数组:
[DllImport("icsneo40.dll")]
public static extern Int32 icsneoGetMessages(
Int32 hObject,
[Out] icsSpyMessage[] pMsg,
ref Int32 pNumberOfMessages,
ref Int32 pNumberOfErrors
);
[out]属性指示p/invoke封送器将本机内存封送回托管结构数组。封送器将根据托管数组的长度封送元素
因此,您需要在调用函数之前分配此数组。您正在调用的API要求您提供至少20000个元素的数组
icsSpyMessage[] pMsg = new icsSpyMessage[20000];
Int32 result = icsneoGetMessages(hObject, pMsg,
ref pNumberOfMessages, ref pNumberOfErrors);
像这样:
[DllImport("icsneo40.dll")]
public static extern Int32 icsneoGetMessages(
Int32 hObject,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)]
out icsSpyMessage[] pMsg,
ref Int32 pNumberOfMessages,
ref Int32 pNumberOfErrors
);
为什么要把事情复杂化?所有这些都是指向某种结构或结构数组的指针。因此,请声明大小为20k的数组 icsSpyMessage myMessages[20000] 按如下方式将其传递给此方法:
[DllImport("icsneo40.dll")]
public static extern Int32 icsneoGetMessages(Int32 hObject, ref icsSpyMessage pMsg, ref Int32 pNumberOfMessages, ref Int32 pNumberOfErrors);
int result=icsnoGetMessages(
等等,
myMessages[0],//这是不正确的。它不应该使用
out
参数。应该删除该参数。相反,您需要[out]
属性。请参阅我的答案。由于默认行为是封送整个数组,因此不需要使用MarshalAs
。我想SizeParamIndex可能对性能有价值。