V
Valdocco
Приветствую вас, уважаемые участники форума!
Я пишу приложение на Visual Studio .NET 2008 Framework 3.5 sp1, которое должно работать с сервером на COM+. Компонент COM+ написан на C++, Studio 6.0
Клиент запускает на сервере метод, который должен вернуть строку.
Объявление метода на сервере:
Функция GetItem обращается к массиву SafeArray, и вот её текст на всякий случай:
В клиенте этот метод вызывается:
class.get_Body(i)
В случае если строка небольшая (< 16383 символа), то все в порядке, все корректно отрабатывает. А если больше, то возникет ошибка. Дебагер пишет:
"Обнаружено недопустимое значение типа VARIANT во время преобразования неуправляемого значения типа VARIANT в управляемый объект. Передача в CLR недопустимого значения типа VARIANT может вызвать неожиданные исключения, а также повреждение или потерю данных."
Генерится эксепшн:
"System.AccessViolationException: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."
Если у кого есть идеи, как исправить эту ситуацию, то буду очень благодарен помощи.
Может нужно использовать другой тип данных на сервере или прописать явно маршалинг?
Я пишу приложение на 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;
}
Код:
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: Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена."
Если у кого есть идеи, как исправить эту ситуацию, то буду очень благодарен помощи.
Может нужно использовать другой тип данных на сервере или прописать явно маршалинг?