2017-01-31 5 views
-2

dynamic_cast를 사용하여 COM 인터페이스를 인터페이스를 구현하는 C++ 클래스로 변환하는 C++/ATL (액티브 템플릿 라이브러리)의 오래된 COM 구성 요소가 있습니다.C# com 표시 객체가있는 C++ dynamic_cast

변환이 불가능한 경우 dynamic_cast는 NULL 포인터를 반환합니다.

이제는 표시 가능한 C# 구성 요소에 동일한 COM 인터페이스의 새로운 구현이 추가되었습니다.

C#에서 COM 개체에 dynamic_cast 연산자를 적용하면 NULL이 반환 될 것으로 예상되지만 실제로 예외를 throw합니다 (어떤 예외가 있는지 전혀 모릅니다).

try/catch 블록에서 dynamic_cast를 확실히 감쌀 수 있지만이 정상적인 동작입니까?

+0

예, COM 호출 가능 래퍼는 당신이 얻으려는 클래스가 아닙니다. 다른 인터페이스에서 내부 기능을 노출하고 이에 대한 'QueryInterface'를 수행해야합니다. 또한 CCW는 C++ 객체가 아니 어서 처음부터 캐스트 할 수 있습니다. – Mgetz

+0

dynamic_cast가 실패해야한다는 것은 내게는 분명합니다. 문제는 NULL을 반환하는 대신 예외를 throw하는 이유입니다. 내가 아는 한 문서화 된 동작입니다. 기본 객체는 C++이 아니지만 CCW는 필수적으로 동일한 호출 규칙을 지원하는 관리되지 않는 객체입니다. dynamic_cast 연산자로는 충분하지 않습니다. 놀랍습니다. –

+0

AFAIK가 정의되지 않은 동작을하는 모듈을 통해 RTTI에 액세스하려고하기 때문에 추측 할 수 있습니다. 정확히 어떤 예외가 던져 졌는지, 그리고 오류 콘솔이 정확히 무엇을 말할 수 있는지를 모르는 채로 나는 말했다. – Mgetz

답변

0

MGetz이 올바른 정보를 제공했다고 생각합니다.

dynamic_cast는 런타임 유형 정보 (RTTI)에 의존합니다. 이것은 모든 코드가 동일한 컴파일러로 컴파일되는 동일한 프로젝트에서만 작동 할 수 있음을 의미합니다 (동일한 컴파일러 옵션 사용). 내가 RTTI를 사용하지 않도록 설정하면

, 나는 효과적으로

warning C4541: 'dynamic_cast' used on polymorphic type 'IMyInterfaceName' with /GR-; 
unpredictable behavior may result 

를 얻을, 우리는 C#을 개체의 COM 호출 가능 래퍼 (CCW)에 그 dynamic_cast는 또한 예기치 않은 동작을 초래 말을이을 확장 할 수 있습니다.

dynamic_cast를 피하는 것이 좋습니다.