2013-10-03 108 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); 
    ... 
} 
相關問題