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

  • Общие обсуждения

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

    Объявление метода на сервере:   

    *.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, и вот её текст на всякий случай:

    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: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."

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

    • Изменен тип I.Vorontsov 2 августа 2010 г. 5:35
    • Перемещено Siddharth Chavan 1 октября 2010 г. 21:19 MSDN Forums Consolidation (От:Visual C#)
    7 апреля 2010 г. 13:57

Все ответы

  • Уважаемый пользователь!

     

    В вашей теме отсутствует активность в течение последних 5 дней. При отсутствии каких-либо действий в течение 2 последующих дней, тема будет переведена в разряд обсуждений. Вы можете возобновить дискуссию, просто оставив сообщение в данной теме.


    Для связи [Mail]
    15 июля 2010 г. 14:01