У меня есть функция 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?
Это указатель на строку. Подобные функции очень сложно безопасно использовать в C++, при выходе из строя они не улучшаются. Пока вам не нужно освобождать память для строки, вы можете объявить ее ByRef virname2 As IntPtr и использовать Marshal.PtrToStringAnsi() для восстановления строки. –
Не является ли параметр char ** массивом символов, не IntPtr? – user1924308
char * - указатель на массив символов. Вот как C хранит строку, у нее нет выделенного типа строки. Символ ** является указателем на указатель на такой массив. Таким образом, указатель на строку C. IntPtr может хранить указатель. –