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

How to call a method that returns an array of strings in Borland C++?

本文关键字:返回 字符串 数组 方法 C++ Borland 何调用 调用      更新时间:2023-10-16

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

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