C++에서 ATL로 작성된 32 비트 COM 구성 요소가 있습니다. 64 비트 .NET에서 사용할 필요가있을 때 COM + 응용 프로그램을 만들고 모든 것이 올바르게 작동합니다.마샬링 된 COM 인터페이스에서 Foreach가 실패합니다.
최근 우리는 Win2k8에서 이상한 동작을 발견했습니다. 우리 구성 요소의 COM 객체는 이벤트를 발생시키고 .NET 코드로 처리합니다. 이벤트에는 관리되지 않는 코드에서도 전달 된 매개 변수가 있습니다. 이벤트 핸들러는 IOurObjectInterface 인스턴스를 전달
interface IOurCollectionInterface : IDispatch
{
[propget, restricted, id(DISPID_NEWENUM)]]
HRESULT _NewEnum([out, retval] IUnknown** result);
}
interface IOurObjectInterface : IDispatch
{
[propget]
HRESULT Collection([out, retval] IOurCollectionInterface** result);
}
:
여기서 설명 (IDL 표기)에 대한 부분적인 정의이다. 내부에서 foreach() 루프를 실행하려고합니다. 하여 IEnumVARIANT에 대한 QI가
IEnumVARIANT
가 있는지에 의해 반환 된 객체에 의해 구현되고 관리되지 않는 서버에 실패
void onEvent(IOurObjectInterface ourObject)
{
foreach(object element in ourObject.Collection) {
//do stuff
}
}
다음과 같은 메시지와 foreach는있는 라인의 코드 충돌
IOurCollectionInterface::get__NewEnum()
구현. 위의 코드는 WinXP 및 Win2k3에서 올바르게 작동하지만 Win2k8에서는 작동하지 않습니다.
그런 행동의 이유는 무엇입니까?
오류의 HRESULT는 무엇입니까? – Richard