Как вызвать метод, который возвращает массив строк в Borland C ++?

Я создал оболочку COM в C # с методом, который возвращает массив строк:

public string[] GetArrayOfStrings()
{
string[] array = new string[3];
array[0] = "first";
array[1] = "second";
array[2] = "third";

return array;
}

В VB6 я вызываю этот метод и представляю строки в списке следующим образом:

Dim s() As String
s = obj.GetArrayOfStrings()
For i = LBound(s) To UBound(s)
List1.AddItem s(i)
Next i

Кто-нибудь знает, как вызвать этот метод из Borland C ++ и получить все элементы в возвращаемом массиве?

0

Решение

Массивы в COM обрабатываются SAFEARRAY структура.

В зависимости от того, как COM-объект предоставляет массив, он может вернуть SAFEARRAY напрямую, например:

SAFEARRAY *psa = obj->GetArrayOfStrings();
VARTYPE vtype;
SafeArrayGetVartype(psa, &vtype);
if (vtype == VT_BSTR)
{
LONG lBound, uBound;
SafeArrayGetLBound(psa, 0, &lBound);
SafeArrayGetUBound(psa, 0, &uBound);
for(LONG i = lBound; i <= uBound; ++i)
{
BSTR str;
SafeArrayGetElement(psa, &i, &str);
...
SysFreeString(str);
}
}
SafeArrayDestroy(psa);

Или это может быть обернуто внутри VARIANT вместо структуры, например:

VARIANT v = obj->GetArrayOfStrings();
if (V_VT(&v) & VT_ARRAY)
{
SAFEARRAY *psa = V_ARRAY(&v);
...
}
VariantClear(&v);

В любом случае, элементы внутри массива могут быть или не быть обернуты внутри VARIANT структуры, например:

SafeArrayGetVartype(psa, &vtype);
if (vtype == VT_VARIANT)
{
...
VARIANT elem;
VariantInit(&elem);
SafeArrayGetElement(psa, &i, &elem);
...
VariantClear(&elem);
...
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]