Проблема в том, что ни VMT, ни typeinfo классов, которые реализуют интерфейс, не содержат никаких ссылок на typeinfo этих интерфейсов. Типинфо для интерфейсов затем удаляется компоновщиком, если в программе не указано иное. Чтобы исправить это, необходимо изменить формат typeinfo для классов, чтобы ссылаться на typeinfo реализованных интерфейсов, иначе все интерфейсы должны быть строго связаны с исполняемым файлом. Другие виды исправлений, такие как интерфейсы с сильными связями, которые реализуются связанными классами без фактического включения ссылок в класс typeinfo, проблематичны из-за того, как работает интегрированный интеллектуальный компоновщик компилятора.
Другим способом решения этой проблемы является использование директивы {$STRONGLINKTYPES ON}
. Это приведет к тому, что все типы в таблице корневых типов EXE, BPL или DLL (индекс, позволяющий RTL сопоставлять квалифицированные имена с типами) будут связаны с сильными исправлениями, а не со слабыми исправлениями. Символы, которые имеют только слабые исправления, ссылающиеся на них, удаляются интеллектуальным компоновщиком; если одна или несколько сильных фиксаций ссылаются на символ, то он включается в конечный двоичный файл, а слабые ссылки не удаляются (на самом деле @PointerToNil).
Как описано в других ответах, TypeInfo(ITheInterface)
в не мертвом коде устраняет проблему; это происходит потому, что магическая функция TypeInfo () создает сильное исправление интерфейса.