#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
, тогда вам нужен небезопасный код для создания aByte*
, который может быть переданSystem::String
конструктору. Не забудьте передать указатель обратно на правильную функцию освобождения, предоставляемую библиотекой, какой бы она ни была.2. Привет, Бен, спасибо за этот золотой совет. Чтобы работать с неуправляемым значением, вы должны сохранить его в памяти, а затем сделать его копию, с которой мы можем работать. Более подробную информацию можно найти здесь: msdn.microsoft.com/en-us/library/ms146631 (v = против 110).aspx
3.
Marshal.Copy
на самом деле это не то, что вы хотите здесь. Если бы это был пользовательский тип, тогдаMarshal.PtrToStructure()
было бы уместно; поскольку это строкаMarshal.PtrToStringAnsi()
, это правильный инструмент для создания копии в управляемый объект.