Как передать массив строк в VB?
От: dead_ricky  
Дата: 12.07.04 11:53
Оценка:
Как передать массив строк в 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


Подскажите плз что тут не так , и как надо правильно.
Заранне благодарен.
Re: Как передать массив строк в VB?
От: Vi2 Удмуртия http://www.adem.ru
Дата: 12.07.04 14:01
Оценка: 4 (1)
Здравствуйте, 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
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.