Возвращение списка строк с нулевым символом в конце из внешней функции в .NET - PullRequest
1 голос
/ 29 марта 2012

Я пытаюсь вызвать внешнюю функцию C ++, используя VB.NET (ответы в C # в порядке, я могу преобразовать обратно), которая возвращает список имен устройств. Это происходит в виде указателя на завершенный нулем массив массивов символов с нулевым символом в конце (поправьте меня, если я неправильно понял, с чем я имею дело) с сигнатурой функции:

long GetNames(char*** names)

Большинство ответов на похожие вопросы, которые я нашел, были связаны с чем-то вроде:

long GetNames(char** names, int length)

Из того, что я прочитал, следует, что мне нужно дать ему IntPtr, но я не уверен относительно того, как это следует инициализировать, и в моем случае я не знаю длину массива. На данный момент в модуле VB у меня есть:

<DllImport("MyExternal.dll", CallingConvention:=CallingConvention.Cdecl)> _
Function GetNames(ByRef names as IntPtr) As UInteger
End Function

Я пытался вызвать функцию, передавая IntPtr, инициализированный как IntPtr.Zero, или используя Marshall.AllocHGlobal, но я всегда получаю AccessViolationException.

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

РЕДАКТИРОВАТЬ: я нашел образец вызова функции в родном C следующим образом:

char **tmplist;
GetNames(&tmplist)

1 Ответ

0 голосов
/ 29 марта 2012

* будет означать указатель на указатель на указатель, что очень редко.
Я ожидаю, что вы имеете дело с указателем на указатель в терминах c, который является вызовом ByRef для StringBuilder. Если вы не получили длину, вам, возможно, придется самостоятельно выполнять арифметику с указателями, пока не найдете нулевое значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...