Когда я определяю интерфейс в IDL, который не является производным от чего-либо, прекомпилятор MIDL предупреждает как таковой (Visual C++ 2008):
предупреждение MIDL2271: интерфейсы [объект] должны быть производными от другого интерфейса [объекта], такого как IUnknown (...)
И если я получаю свой интерфейс от другого, который не является производным от IUnknown, MIDL терпит неудачу:
ошибка MIDL2257: только IUnknown может использоваться в качестве корневого интерфейса (...)
Теперь мой вопрос: это ограничение в прекомпиляторе COM или MIDL?
Недавно я смотрел заголовки D3D10, и d3d10.h, очевидно, был сгенерирован с использованием IDL (MIDL добавляет комментарий к этому эффекту). И все интерфейсы так или иначе являются производными от IUnknown.
Однако периферийные заголовки (d3d10shader.h, d3d10effect.h и т. д.) Содержат определенные вручную COM-интерфейсы, некоторые из которых могут вызвать предупреждение или ошибку, описанную здесь. Я могу только предположить, что им пришлось определять их вручную, чтобы избежать этих ограничений.
Я прав? Почему MIDL запрещает использование чистых интерфейсов?





Интерфейс, не производный от IUnknown, не является COM. Это основной строительный блок, который позволяет управлять памятью и обнаруживать интерфейсы.
Могут быть интерфейсы, не производные от IUnknown. Однако это не COM, это просто обычный указатель.