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