Я пытаюсь вызвать внешнюю функцию 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)