У меня есть старый 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, но это нормальное поведение?
Да, COM Callable Wrapper НЕ является классом, который вы пытаетесь получить. Вам нужно будет открыть любую внутреннюю функциональность на другом интерфейсе и выполнить для нее 'QueryInterface'. Кроме того, CCW не может быть C++-объектом и, таким образом, действительным для включения в первую очередь. – Mgetz
Мне совершенно ясно, что dynamic_cast не работает. Вопрос в том, почему он генерирует исключение вместо того, чтобы возвращать NULL, что, насколько я знаю, является документированным поведением. Основной объект не является C++, но CCW обязательно является неуправляемым объектом, который поддерживает одно и то же соглашение о вызовах. Этого, по-видимому, недостаточно для оператора dynamic_cast. Я нахожу это удивительным. –
Если бы я предполагал, что это потому, что вы пытаетесь получить доступ к RTTI через модули, которые AFAIK - это неопределенное поведение. Тем не менее, не зная точно, какое исключение выбрано, и что консоль ошибок сказала, что я не могу быть уверен. – Mgetz