Как передать массив строк в VB?
Есть такой код сервера (С++):
STDMETHODIMP CSomeManObj::EnumSome(VARIANT* psaSome)
{
VARIANT theArray;
SAFEARRAY* pSA;
SAFEARRAYBOUND bound[1];
CComBSTR bstrSomes[2] = {L"Element number 1", L"Element number 2"};
bound[0].lLbound = 0;
bound[0].cElements = 2;
pSA = SafeArrayCreate(VT_BSTR, 1, bound);
for (int i = 0; i < 2; i++)
SafeArrayPutElement(pSA, (LONG*)&i, bstrSome[i]);
VariantInit(&theArray);
theArray.vt = VT_DISPATCH | VT_BYREF;
theArray.parray = pSA;
VariantCopy(psaSome, &theArray);
return S_OK;
}
и такой код клиента (VB):
Sub GetSomes()
Dim Somes(0 To 1) As String
Dim o As New SomeManObj
o.EnumSome (Somes)
MsgBox Somes(1)
End Sub
Подскажите плз что тут не так
![](/Forum/Images/confused.gif)
, и как надо правильно.
Заранне благодарен.
Здравствуйте, dead_ricky, Вы писали:
_>Как передать массив строк в VB?
Как SAFEARRAY(BSTR) или через VARIANT с VT_ARRAY|VT_BSTR (как у тебя) или VT_ARRAY|VT_VARIANT с элементами, которые, в свою очередь, содержат строки VT_BSTR.
_>Есть такой код сервера (С++):
_>STDMETHODIMP CSomeManObj::EnumSome(VARIANT* psaSome)
Ну вот неоднозначно такое определение, лучше приводить описание из IDL файла.
1. out,retval
STDMETHODIMP CSomeManObj::EnumSome(/*[out,retval]*/ VARIANT* psaSome)
_>{
_> SAFEARRAY* pSA;
_> SAFEARRAYBOUND bound[1];
_> CComBSTR bstrSomes[2] = {L"Element number 1", L"Element number 2"};
_> bound[0].lLbound = 0;
_> bound[0].cElements = 2;
_> pSA = SafeArrayCreate(VT_BSTR, 1, bound);
_> for (int i = 0; i < 2; i++)
_> SafeArrayPutElement(pSA, (LONG*)&i, bstrSome[i]);
psaSome -> vt = VT_ARRAY | VT_BSTR;
psaSome -> parray = pSA;
_> return S_OK;
_>}
_>Sub GetSomes()
_> Dim Somes() As String
_> Dim o As New SomeManObj
Somes = o.EnumSome
_> MsgBox Somes(1)
_>End Sub
2. in,out
STDMETHODIMP CSomeManObj::EnumSome(/*[in,out]*/ VARIANT* psaSome)
_>{
_> SAFEARRAY* pSA;
_> SAFEARRAYBOUND bound[1];
_> CComBSTR bstrSomes[2] = {L"Element number 1", L"Element number 2"};
_> bound[0].lLbound = 0;
_> bound[0].cElements = 2;
_> pSA = SafeArrayCreate(VT_BSTR, 1, bound);
_> for (int i = 0; i < 2; i++)
_> SafeArrayPutElement(pSA, (LONG*)&i, bstrSome[i]);
VariantClear( psaSome );
psaSome -> vt = VT_ARRAY | VT_BSTR;
psaSome -> parray = pSA;
_> return S_OK;
_>}
_>Sub GetSomes()
_> Dim Somes() As String
_> Dim o As New SomeManObj
o.EnumSome Somes
или
Call o.EnumSome(Somes)
_> MsgBox Somes(1)
_>End Sub