У нас есть 32-разрядный COM-компонент, написанный с ATL на C++. Когда нужно использовать его с 64-разрядного .NET, мы создаем приложение COM +, и все работает отлично.Foreach не работает с маршаллированным интерфейсом COM
Недавно мы заметили странное поведение на Win2k8. Объект COM в нашем компоненте запускает событие, и мы обрабатываем его в коде .NET. Событие имеет параметр, также переданный из неуправляемого кода.
Вот частичное определение для осветления (IDL нотации):
interface IOurCollectionInterface : IDispatch
{
[propget, restricted, id(DISPID_NEWENUM)]]
HRESULT _NewEnum([out, retval] IUnknown** result);
}
interface IOurObjectInterface : IDispatch
{
[propget]
HRESULT Collection([out, retval] IOurCollectionInterface** result);
}
Обработчик события передается экземпляр IOurObjectInterface. Внутри мы пытаемся запустить цикл foreach().
void onEvent(IOurObjectInterface ourObject)
{
foreach(object element in ourObject.Collection) {
//do stuff
}
}
Кодекса аварий на линию с Еогеаспом со следующим сообщением: QI для IEnumVARIANT неудавшегося на неуправляемом сервере
IEnumVARIANT
наверняка реализуемый объект, возвращаемая функцией IOurCollectionInterface::get__NewEnum()
осуществления. Этот код работает отлично на WinXP и Win2k3, но не на Win2k8.
В чем причина такого поведения?
Что такое HRESULT в ошибке? – Richard