如何在Borland C ++中调用返回字符串数组的方法?

时间:2013-10-03 05:41:12

标签: c++ arrays dynamic com borland-c++

我在C#中使用返回字符串数组的方法创建了一个COM包装器:

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 ++调用该方法并获取返回数组中的所有元素?

1 个答案:

答案 0 :(得分:2)

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);
    ...
}