Получение C указателя на ссылку указателя обратно из функции

#c #vb.net #pointers

#c #vb.net #указатели

Вопрос:

В настоящее время я застрял на вызове функции из C немагитируемой DLL.

У него есть функция для получения значений. Однако возвращаемое значение функции является логическим (true, если нет ошибки). Значение, которое мы хотим, находится в одном из параметров: const char** value Если я правильно понимаю C , это указатель на указатель. Обычно указатель можно обрабатывать в .net, используя ByRef в параметре, изменяя значение, которое вы вводите. Однако я не знаю, как заставить указатель на указатель работать.

Короткая история: как преобразовать:

 extern "C" __EXPORT bool funcName(const char** value)
  

В C # / VB.net

Это работает для const char* value , но не для const char** value

 <DllImport("Path_To_Dll.Dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function FuncName(ByRef GetValue as string) as boolean
End Function

Dim HereReturnValue as string

Private Function GetValue() as string
    FuncName(HereReturnValue)
    Return HereReturnValue
End Function
  

Комментарии:

1. ByRef IntPtr , тогда вам нужен небезопасный код для создания a Byte* , который может быть передан System::String конструктору. Не забудьте передать указатель обратно на правильную функцию освобождения, предоставляемую библиотекой, какой бы она ни была.

2. Привет, Бен, спасибо за этот золотой совет. Чтобы работать с неуправляемым значением, вы должны сохранить его в памяти, а затем сделать его копию, с которой мы можем работать. Более подробную информацию можно найти здесь: msdn.microsoft.com/en-us/library/ms146631 (v = против 110).aspx

3. Marshal.Copy на самом деле это не то, что вы хотите здесь. Если бы это был пользовательский тип, тогда Marshal.PtrToStructure() было бы уместно; поскольку это строка Marshal.PtrToStringAnsi() , это правильный инструмент для создания копии в управляемый объект.