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

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

最佳答案

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

关于c++ - 如何在 Borland C++ 中调用返回字符串数组的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19151603/

相关文章:

javascript - 如何用http请求的响应填充数组?

arrays - 大型动态数组 Fortran 声明段错误

python - 动态加载两个 libpython 版本

c++ - 在 GDB 中运行应用程序直到发生异常

c# - QNetworkAccessManager->在 DLL 中调用时卡住

c++ - CPU 密集型 OpenGL 函数

c++ - 使用 strptime 将字符串转换为时间但得到垃圾

javascript - lodash 为数组中的每个对象分配一个字段

javascript - 遍历 .replace() 中的数组

C realloc(动态数组) - 访问冲突