Когда я определяю интерфейс в 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 предотвращает использование чистых интерфейсов?