How to pass string[] from .NET (С#) to COM (C++)
От: Cybo Россия N/A
Дата: 01.06.05 09:51
Оценка:
День добрый!

Есть следующая ситуация:
1. есть COM объект (С++) с методом типа:


    [id(10), helpstring("Do Some Command")]
    HRESULT DoCmd([in] VARIANT cmd);



2. есть C# код, который вызывает данный метод и при вызове должен отдать массив строк string[]. Логично предположить, что
массив строк на стороне С++ COM объекта должен предстать как SAFEARRAY of BSTR.


Так все и получается. Почти так.
Приходящий вариант имеет тип: VT_ARRAY | VT_BSTR, что мы и ожидали. Далее получение количества элементов этого массива тоже дает корректный результат. Но вот получение самих элементов массива — строк — не дает ничего. Хорошего. Выглядит это like this:



CSomeClass::CSomeClass(VARIANT srcStrArr)
{
  m_strArr.erase(m_strArr.begin(), m_strArr.end());  // m_strArr is std::vector<CString>
  CComVariant srcVar(srcStrArr);
  SAFEARRAY* saSRC = srcVar.parray;
    
  long lBound;
  long uBound;

  if(FAILED(SafeArrayGetLBound(saSRC, 1, &lBound)))
  {
    throw CExcept(L"CSomeClass - FAILED(SafeArrayGetLBound)");
  }
    
  if(FAILED(SafeArrayGetUBound(saSRC, 1, &uBound)))
  {
    throw CExcept(L"CSomeClass - FAILED(SafeArrayGetUBound)");
  }
    
  long ix = 0;
  for(int i = 0, cnt = uBound - lBound + 1; i < cnt; ++i)
  {
    ix = lBound + i;
    CComVariant val;
    if(FAILED(SafeArrayGetElement(saSRC, &ix, &val)))
    {
      throw CExcept(L"CSomeClass - FAILED(SafeArrayGetElement)");
    }
    m_strArr.push_back(CString(val.bstrVal));
  }
}



Так вот строки, то есть BSTRы, которые мы получаем при проходе по массиву и извлечении их с пом. SafeArrayGetElement содержат какой-то мусор. И длинна этих строк с реальностью не имеет ничего общего.

Какие соображения, предположения, советы будут??? Заранее спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.