2009-04-08 4 views
2

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에서는 작동하지 않습니다.

그런 행동의 이유는 무엇입니까?

+0

오류의 HRESULT는 무엇입니까? – Richard

답변

0

확실치 않습니다. 그러나 마샬링 문제가 의심됩니다.

IOurCollectionInterface._NewEnum의 구현이 실제로 호출되는 것을 확인 했습니까?

어떤 종류의 COM 마샬링을 사용하고 있습니까? typelib 인 경우 형식 라이브러리가 올바르게 등록 되었습니까?

인터페이스가 진행중인 경우 작동합니까? 코멘트에서


sharptooth의 :

TypeLib의 정렬 화를 사용하여 형식 라이브러리가 등록됩니다. 더 나쁜 것은, 같은 컴퓨터에서 WinForms 응용 프로그램에서 호출 될 때이 작업이 제대로 작동하지만 로컬 사용자로 실행되는 NT 서비스에서 호출 될 때 실패합니다.

WinForms 앱과 서비스가 다른 사용자로 실행되는 경우 보안을 매우 신중하게 확인해야합니다. COM + 보안으로 시작한 다음 프로세스 모니터에서 레지스트리/파일 액세스 문제를 확인하십시오 (이럴 가능성은 없지만 항상 가능함).

+0

Typelib 마샬링이 사용되고 형식 라이브러리가 등록됩니다. 더 나쁜 것은, 같은 컴퓨터에서 WinForms 응용 프로그램에서 호출 될 때이 작업이 제대로 작동하지만 로컬 사용자로 실행되는 NT 서비스에서 호출 될 때 실패합니다. – sharptooth

0

시스템 계정으로 실행하고 오류에 대한 자세한 정보는 이벤트를 확인하십시오.

관련 문제