Как получить следующий элемент в массиве, когда мне передается первый элемент через pinvoke? - PullRequest
1 голос
/ 26 января 2012

Я использую API, метод которого определен следующим образом:

[DllImport("icsneo40.dll")]
public static extern Int32 icsneoGetMessages(Int32 hObject, ref icsSpyMessage pMsg, ref          Int32 pNumberOfMessages, ref Int32 pNumberOfErrors);

с параметром icsSpyMessage, описанным как:

pMsg [out]
Это адрес первого элемента массива структуры icsSpyMessage. Этот массив будет загружен сообщения, полученные аппаратным обеспечением. Этот массив должен быть размером, чтобы соответствовать 20 000 структур icsSpyMessage

Мой вопрос: как мне получить доступ к другим элементам массива, когда все, что у меня есть, это первый элемент?

Ответы [ 3 ]

3 голосов
/ 26 января 2012

Поскольку вы передаете массив, вы должны объявить icsSpyMessage как массив:

[DllImport("icsneo40.dll")]
public static extern Int32 icsneoGetMessages(
    Int32 hObject, 
    [Out] icsSpyMessage[] pMsg,
    ref Int32 pNumberOfMessages, 
    ref Int32 pNumberOfErrors
);

Атрибут [out] указывает маршаллеру p / invoke упорядочить собственную память обратно в управляемый массив структур. Маршаллер будет маршалировать элементы в соответствии с длиной управляемого массива.

Так что вам нужно выделить этот массив перед вызовом функции. API, который вы вызываете, требует, чтобы вы предоставили массив по крайней мере из 20 000 элементов.

icsSpyMessage[] pMsg = new icsSpyMessage[20000];
Int32 result = icsneoGetMessages(hObject, pMsg, 
    ref pNumberOfMessages, ref pNumberOfErrors);
0 голосов
/ 11 января 2013

Зачем все усложнять? Все это указатель, который указывает на какую-то структуру или массив структур. Поэтому объявите ваш массив размером 20 КБ

icsSpyMessage myMessages [20000];

передать его этому методу следующим образом:

int result = icsneoGetMessages ( blahh, myMessages [0], // << == это указатель на первый элемент структуры или объекта ... blahh, blahh); </p>

Когда вы получаете сообщения, вы можете выполнять итерацию через "foreach (элемент icsSpyMessage в myMessages) {...}

надеюсь, это поможет ..

0 голосов
/ 26 января 2012

Как это:

[DllImport("icsneo40.dll")]

public static extern Int32 icsneoGetMessages(
    Int32 hObject, 
    [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 2)]
    out icsSpyMessage[] pMsg, 
    ref Int32 pNumberOfMessages, 
    ref Int32 pNumberOfErrors
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...