Здравствуйте 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";
}
Успехов!