Хотите знать, как использовать VB.NET для вызова функции C ++ с массивом в качестве параметра:
dim mystring as string = "a,b,c"dim myarray() as string
myarray = split(mystring,",")
cfunction(myarray)
Cfuncton будет в C ++, но я не могу использовать тип строковой переменной в C ++ по другим причинам, я могу использовать только char. Как должна выглядеть моя функция C ++, чтобы правильно получить массив и разделить его обратно на строки?
По сути, создайте некоторую закрепленную память для хранения строк и передайте ее своей функции:
Marshal.AllocHGlobal
выделит некоторую память для вас, что вы можете дать вашей функции C ++. Увидеть http://msdn.microsoft.com/en-us/library/s69bkh17.aspx. Ваша функция c ++ может принять это как аргумент char *.
Пример:
Во-первых, вам нужно преобразовать ваши строки в один большой байт [], разделяя каждую строку нулями (0x00). Давайте сделаем это эффективно, выделив всего один байтовый массив.
Dim strings() As String = New String() {"Hello", "World"}
Dim finalSize As Integer = 0
Dim i As Integer = 0
Do While (i < strings.Length)
finalSize = (finalSize + System.Text.Encoding.ASCII.GetByteCount(strings(i)))
finalSize = (finalSize + 1)
i = (i + 1)
Loop
Dim allocation() As Byte = New Byte((finalSize) - 1) {}
Dim j As Integer = 0
Dim i As Integer = 0
Do While (i < strings.Length)
j = (j + System.Text.Encoding.ASCII.GetBytes(strings(i), 0, strings(i).Length, allocation, j))
allocation(j) = 0
j = (j + 1)
i = (i + 1)
Loop
Теперь мы просто передаем это некоторой памяти, которую мы выделяем с помощью Marshal.AllocHGlobal
Dim pointer As IntPtr = Marshal.AllocHGlobal(finalSize)
Marshal.Copy(allocation, 0, pointer, allocation.Length)
Вызовите свою функцию здесь. Вам также нужно будет передать количество строк, которые вы даете функции. Когда вы закончите, не забудьте освободить выделенную память:
Marshal.FreeHGlobal(pointer)
НТН.
(Я не знаю VB, но я знаю C # и как использовать Google (http://www.carlosag.net/tools/codetranslator/), извините, если это немного не так! :П)
Этот пример в C # — это то же самое, что и VB.NET, и он имеет объявление метода C ++, если вы хотите использовать его. C #: передача массива строк в C ++ DLL