2013-06-21 2 views
0

У меня есть функция C++:VB.NET указатель на указатель на C

MYDLL_API int scanfile(HANDLE handle, const char *filename, const char **virname){ 
*virname="virusA"; 
} 

Параметр ** virname Я считаю, что это указатель на указатель. Теперь у меня есть объявление функции в VB.NET, которая вызовет эту функцию, ожидая, что virname будет изменено с помощью функции C++.

DllImport("mydll.dll", CallingConvention:=CallingConvention.Cdecl)> _ 
    Public Shared Function scanfile(ByVal handle As Integer, ByVal strpath As String, ByRef virname2 As String) As Integer 
    End Function 

Я неправильно вызываю DLL?

+1

Это указатель на строку. Подобные функции очень сложно безопасно использовать в C++, при выходе из строя они не улучшаются. Пока вам не нужно освобождать память для строки, вы можете объявить ее ByRef virname2 As IntPtr и использовать Marshal.PtrToStringAnsi() для восстановления строки. –

+0

Не является ли параметр char ** массивом символов, не IntPtr? – user1924308

+1

char * - указатель на массив символов. Вот как C хранит строку, у нее нет выделенного типа строки. Символ ** является указателем на указатель на такой массив. Таким образом, указатель на строку C. IntPtr может хранить указатель. –

ответ

0

Похоже, что «virname» представляет собой массив C-строк (* virname = «virusA» просто устанавливает первую строку - это эквивалентно virname [0] = «virusA»), поэтому вы должны использовать следующее для последний параметр:

ByVal virname() As String 
+0

Нет, это не массив строк. –

+0

Ok - массив указателей на символы ... –

+2

№ Обратите внимание на код C, он не назначает элемент массива. Тип строкового литерала - char *. –