2013-10-03 106 views
0

我创建了一个C#COM包装与返回字符串数组的方法:如何调用返回Borland 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++调用该方法并获取返回数组中的所有元素?

回答

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); 
    ... 
} 
相关问题