2017-01-31 10 views
-2

У меня есть старый COM-компонент в C++/ATL (Active Template Library), который использует dynamic_cast для преобразования COM-интерфейса в класс C++, который реализует интерфейс.C++ dynamic_cast с видимым объектом C# com

Если преобразование невозможно, dynamic_cast возвращает указатель NULL.

У меня теперь есть новая реализация того же COM-интерфейса в com-видимом компоненте C#.

Когда оператор dynamic_cast применяется к объекту COM из C#, я ожидаю, что он вернет NULL, но на самом деле он генерирует исключение (я не знаю, какое исключение).

Я могу, конечно, обернуть dynamic_cast в блок try/catch, но это нормальное поведение?

+0

Да, COM Callable Wrapper НЕ является классом, который вы пытаетесь получить. Вам нужно будет открыть любую внутреннюю функциональность на другом интерфейсе и выполнить для нее 'QueryInterface'. Кроме того, CCW не может быть C++-объектом и, таким образом, действительным для включения в первую очередь. – Mgetz

+0

Мне совершенно ясно, что dynamic_cast не работает. Вопрос в том, почему он генерирует исключение вместо того, чтобы возвращать NULL, что, насколько я знаю, является документированным поведением. Основной объект не является C++, но CCW обязательно является неуправляемым объектом, который поддерживает одно и то же соглашение о вызовах. Этого, по-видимому, недостаточно для оператора dynamic_cast. Я нахожу это удивительным. –

+0

Если бы я предполагал, что это потому, что вы пытаетесь получить доступ к RTTI через модули, которые AFAIK - это неопределенное поведение. Тем не менее, не зная точно, какое исключение выбрано, и что консоль ошибок сказала, что я не могу быть уверен. – Mgetz

ответ

0

Я думаю, что MGetz предоставил правильную информацию.

dynamic_cast зависит от информации о времени выполнения (RTTI). Это означает, что он может работать только в однородном проекте, где весь код скомпилирован с одним и тем же компилятором (с использованием тех же параметров компилятора).

Если отключить RTTI, я получаю

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

эффективно, мы можем распространить это сказать, что dynamic_cast на COM вызываемую обертку (КОО) объекта C# также приводит к непредсказуемому поведению.

Лучше избегать динамического перехода.