2009-04-08 3 views
2

У нас есть 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.

В чем причина такого поведения?

+0

Что такое HRESULT в ошибке? – Richard

ответ

0

Трудно быть уверенным. Но было бы подозрительно, что проблема будет решена.

Вы проверили, что на самом деле вызывается реализация IOurCollectionInterface._NewEnum?

Какой тип сортировки COM вы используете? Если typelib, правильно ли зарегистрирована typelib?

Это работает, если интерфейс реализован в процессе?


С комментарием по sharptooth:

Typelib сортировочных используется и TypeLib зарегистрирован. Хуже того, этот материал отлично работает при вызове из приложения WinForms на том же компьютере, но сбой при вызове из службы NT под локальным пользователем.

Если приложение и служба WinForms работают как разные пользователи, время для проверки безопасности очень тщательно. Начните с безопасности COM +, а затем проверьте с помощью Process Monitor проблемы с доступом к реестру/файлу (это кажется маловероятным, но всегда возможно).

+0

Используется маршаллинг Typelib и зарегистрирован typelib. Хуже того, этот материал отлично работает при вызове из приложения WinForms на том же компьютере, но сбой при вызове из службы NT под локальным пользователем. – sharptooth

0

Попробуйте использовать системную учетную запись и проверить события для получения дополнительной информации об ошибках.