Ответ 1
Это так, потому что ранний OLE/COM имел ошибку, и Borland решил совместиться с ней. Это упоминается в этой статье: Новая функция языка Delphi: множественное наследование для интерфейсов в Delphi для .NET. Решение состоит в том, чтобы явно указать все интерфейсы предков в классе, как писал Микаэль.
Некоторые цитаты из связанной статьи:
Проблема была в самом COM. Чтобы загрузить модуль, COM будет загружать DLL, GetProcAddress в хорошо известную точку входа, которая должна была быть экспортирована из DLL, вызвать функцию DLL для получения интерфейса IUnknown, а затем QueryInterface для IClassFactory. Проблема заключалась в том, что когда Microsoft добавила поддержку IClassFactory2, они добавили QueryInterface для IClassFactory2 после существующего кода, запрошенного для IClassFactory. IClassFactory2 запрашивается только в случае отказа запроса для IClassFactory.
Таким образом, COM никогда не будет запрашивать IClassFactory2 на любом COM-сервере, который реализовал как IClassFactory2, так и IClassFactory.
Эта ошибка существует в COM в течение длительного времени. Microsoft заявила, что они не могут исправить загрузчик COM с помощью пакета обновления ОС, потому что Word и Excel (в то время) полагались на поведение с ошибкой. Независимо от того, исправлено ли это в последних выпусках COM или нет, Borland должна каким-то образом сохранить это поведение в Win32 Delphi в обозримом будущем. Внезапно добавление всех предков в класс реализации, которых раньше не было, скорее всего, приведет к нарушению существующего кода, который непреднамеренно попадает в тот же шаблон, что и загрузчик COM.