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