Проблема при получении длинной строки с Com+

Тема в разделе ".NET", создана пользователем Valdocco, 7 апр 2010.

  1. Valdocco

    Valdocco Гость

    Приветствую вас, уважаемые участники форума!
    Я пишу приложение на Visual Studio .NET 2008 Framework 3.5 sp1, которое должно работать с сервером на COM+. Компонент COM+ написан на C++, Studio 6.0
    Клиент запускает на сервере метод, который должен вернуть строку.

    Объявление метода на сервере:
    Код (Text):
       
    *.h
    STDMETHOD(get_Body)(long index, VARIANT *pVal);

    *.cpp
    STDMETHODIMP ActionDataForA3::get_Body(long index, VARIANT *pVal)
    {

    _variant_t v;
    GetItem(index, 0, v);
    *pVal = v;
    return S_OK;
    }
    Функция GetItem обращается к массиву SafeArray, и вот её текст на всякий случай:
    Код (Text):
       
    void GetItem(long rowIndex, long fieldIndex, VARIANT& Value)
    {
    ATLASSERT(rowIndex >= 0 && rowIndex < m_RowCount);
    ATLASSERT(fieldIndex >= 0 && fieldIndex < m_FieldCount);

    long ind[2];
    ind[0] = rowIndex;
    ind[1] = fieldIndex;
    HRESULT hr = SafeArrayGetElement(m_Data, ind, &Value);
    ATLASSERT(hr == 0);
    }
    В клиенте этот метод вызывается:
    class.get_Body(i)

    В случае если строка небольшая (< 16383 символа), то все в порядке, все корректно отрабатывает. А если больше, то возникет ошибка. Дебагер пишет:
    "Обнаружено недопустимое значение типа VARIANT во время преобразования неуправляемого значения типа VARIANT в управляемый объект. Передача в CLR недопустимого значения типа VARIANT может вызвать неожиданные исключения, а также повреждение или потерю данных."
    Генерится эксепшн:
    "System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."

    Если у кого есть идеи, как исправить эту ситуацию, то буду очень благодарен помощи.
    Может нужно использовать другой тип данных на сервере или прописать явно маршалинг?
     
Загрузка...

Поделиться этой страницей