Каков наилучший способ вернуть массив произвольного размера "строк" из исходного кода C++?dll к a VB.NET применение
Я напишу еще несколько .dll-файлы должны выступать в качестве загружаемого синтаксического анализатора для настраиваемых пользователем аппаратных устройств (несколько похожих на Плагины). DLL-файлы будут выбраны и загружены пользователем во время выполнения.
Некоторые из функций внутри .Библиотека DLL должна будет возвращать ряд строк, таких как список поддерживаемых функций... или группа доступных мест... и т. д...
Возвращенные строки будут отображаться в списке или выпадающем списке внутри строки. vb.net заявление (которое я тоже буду писать)...
Я потратил значительное количество времени на поиск в интернете (google, форумы и т. д.), И хотя я новичок в этом деле. VB.net, у меня есть некоторый опыт работы с Pascal, Delphi, C, C++ и VB, и я понимаю механику динамической загрузки с использованием LoadLibrary, FreeLibrary, GetProcAddress и т. д... Но теперь я полностью запутываюсь и разочаровываюсь в Сортировке, импорте, экспорте, SafeArray, COleSafeArray и т. д
Правильно ли я поступаю, или есть лучший способ сделать то, чего я пытаюсь достичь?
Что я уже пробовал:
// in Driver.h __declspec(dllexport) SAFEARRAY* _stdcall DriverGetLOT(); // in Driver.cpp void FillSafeArray(OLECHAR FAR *sz, int iRow, COleSafeArray *sa) { VARIANT v; long index[1]; index[0] = iRow; VariantInit(&v); v.vt = VT_BSTR; v.bstrVal = SysAllocString(sz); sa->PutElement(index, v.bstrVal); SysFreeString(v.bstrVal); VariantClear(&v); } SAFEARRAY* _stdcall DriverGetLOT() { DWORD saBounds[] = {4}; COleSafeArray saRet; saRet.Create(VT_BSTR, 1, saBounds); FillSafeArray(strBatchName.AllocSysString(),0,&saRet); FillSafeArray(strWaferName.AllocSysString(),1,&saRet); FillSafeArray(strExpectedYield.AllocSysString(),2,&saRet); FillSafeArray(strOperatorName.AllocSysString(),3,&saRet); return saRet.Detach(); // <=== gives a cant convert VARIANT to SAFEARRAY error }
// in Vb.NET Public Class myClass Private Declare Function DriverGetLOT Lib "Driver.dll"() As string() ' also tried object and VARIANT here Sub DoStuff() Me.lbLOTinfo.Items.AddRange(DriverGetLOT()) end sub end class