Re: Как разобрать Safearray из C++?
От: Leon_o  
Дата: 22.05.02 11:51
Оценка:
Здравствуйте vic_mx6_2.5_V6_dohc, Вы писали:

VM2VD>как воспроизвести на C++ разборку Визуал Бейсиковскго массива,

VM2VD>возвращаемого com-объектом?

Если установлен PSDK (август 2001), то можно использовать шаблонный класс T_SafeVector ,находится в SDK\include\T_SafeVector.h. Пример использования :


.idl :
// Возвращаем массив строк как SAFEARRAY и как VARIANT с SAFEARRAY
HRESULT GetStrings(SAFEARRAY(BSTR) *pStrings, VARIANT* pStringsAsVariant);



Так формируем данные :

STDMETHODIMP CArraySource::GetStrings(SAFEARRAY **pStrings, VARIANT* pStringsAsVariant)
{
    if(!pStrings || !pStringsAsVariant)
        return E_INVALIDARG;
    _bstr_tSafeVector v; // _bstr_tSafeVector определен в T_SafeVector.h
        // добавляем данные
    v.push_back(_bstr_t("abcd")); 
    v.push_back(_bstr_t("1234"));
        // Возвращаем как SAFEARRAY
    *pStrings = v.GetSafeArray();
        // Возвращаем как SAFEARRAY в VARIANT
        *pStringsAsVariant = v.GetVariant().Detach();     
        return S_OK;
}


Так получаем результат :

...
    CComPtr<IArraySource> spSource;
...
    SAFEARRAY *pArr = NULL;
    VARIANT   pArrAsVariant = _variant_t();
    hr = spSource->GetStrings(&pArr, &pArrAsVariant);
    if(SUCCEEDED(hr))
    {
        _bstr_tSafeVector v1(pArr);
        _variant_t  tmpValue(pArrAsVariant);
        _bstr_tSafeVector v2(tmpValue);
        _bstr_t tmp;
        // Получаем данные из первого массива
        tmp = v1[0]; // tmp == "abcd";
        tmp = v1[1];      // tmp == "1234"
        // Получаем данные из второго массива
        tmp = v2[0];      // tmp == "abcd"
        tmp = v2[1];      // tmp == "1234"; 
    }



Успехов!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.