Member 14155667 Ответов: 1

Каков наилучший способ вернуть массив произвольного размера "строк" из исходного кода 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

1 Ответов

Рейтинг:
12

KarstenK

Лучший способ-это вернуться ЕДИНСТВЕННЫЙ строка, которая разделена управляющим символом типа "\n", который отделяет каждую отдельную строку. Затем вы можете разделить эту строку и работать с ней.

Другой подход заключается в том, чтобы иметь функцию, которая возвращает количество массивов и массив.

Я настоятельно рекомендую вам сделать локальную копию массива, чтобы избежать сбоев памяти путем выделения и удаления в разных средах выполнения!!!