LPBYTE как массив определенной длины

-4

Мне нужно импортировать C-функцию, которая описана как

int Read(LPBYTE data, LPBYTE lengthOfData);

В документации говорится следующее:

данные

[out] данные, которые были прочитаны

lengthOfData

[out] длина данных, которые были прочитаны

Ниже приведен пример использования этой функции:

int num = 0;
BYTE data[16] = {0};
while (num < 6)
{
int dataLen = 0;
Read(data, &dataLen);
num += dataLen;
}

Как импортировать эту функцию?
Насколько я понимаю, первым параметром является массив байтов.

Могу ли я импортировать его как:

public static extern int Read([Out] IntPtr data, [Out] byte dataLength);

или я должен использовать out ключевых слов, может быть?

спросил(а) 2015-05-06T16:00:00+03:00 5 лет, 4 месяца назад
0
127

Если функция действительно:

int Read(LPBYTE data, LPBYTE lengthOfData);

Тогда правильный перевод:

[DllImport(..., CallingConvention = CallingConvention.Cdecl)]
static extern int Read([Out] byte[] data, out byte dataLength);

Но это не соответствует вашему C-коду. Код C даже не компилирует вас. Возможно, второй параметр действительно является int.

Для вызова этой функции вам необходимо выделить массив перед вызовом.

byte[] data = new byte[16];
byte dataLength;
int retval = Read(data, out dataLength);

Вам необходимо прояснить следующие детали:

    Каков тип этого второго параметра? Что такое конвенция? Как вы определяете, как предварительно выделить массив?

Эта функция плохо разработана, поскольку она не позволяет вызывающему абоненту указывать, как долго находится массив, и, следовательно, риск переполнения буфера.

ответил(а) 2015-05-06T17:11:00+03:00 5 лет, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема