У меня есть функция DLL, и я хочу, чтобы эта функция возвращала массив целых чисел.
Мое определение функции следующее:
extern "C" void HelloWorldArray(int * &A) {
std::vector<int> *pVectorA = new std::vector<int>;
pVectorA->push_back(2);
pVectorA->push_back(4);
pVectorA->push_back(8);
pVectorA->push_back(16);
pVectorA->push_back(32);
A = pVectorA->data();
}
Насколько я знаю, это эффективновозвращает адрес вектора, который в C ++ гарантирует, что он может быть заменен адресом эквивалентного массива, потому что вектор гарантирует непрерывное расположение в памяти. Я также читал, что использование new для вектора сохраняет как векторные заголовки, так и векторные данные в куче и, следовательно, может использоваться вне функции.
В VB.NET я пытаюсь это:
Imports System.Runtime.InteropServices
Public Class Form1
<DllImport("dll.dll", CallingConvention:=CallingConvention.Cdecl)>
Private Shared Function HelloWorld(ByVal x As Int32) As Int32
End Function
Private Declare Function HelloWorld Lib "dll.dll" (int) As Integer
Private Declare Function HelloWorldArray Lib "dll.dll" (int())
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim j As Integer()
HelloWorldArray(ByRef j as Integer())
Console.WriteLine(j)
End Sub
End Class
Что даже не компилируется, это дает BC30201 Expression expected.
для строки Private Declare Function HelloWorldArray Lib "dll.dll" (int())
.
Любые советы о том, как вернуть массив неизвестной длины из C ++ в VB.NET, приветствуются.
Примечание: массив должен передаваться по ссылке в аргументах, а не как элемент возврата, потому что в реальном приложении несколько массивов необходимо переместить обратно в VB.NET.
Я использую Visual Studio 2017.