Я создал оболочку 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 ++ и получить все элементы в возвращаемом массиве?
Массивы в 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);
...
}
Других решений пока нет …