Определение чистого базового класса с использованием IDL

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


person joelr    schedule 17.12.2008    source источник


Ответы (1)


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

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

person Emmanuel Caradec    schedule 22.12.2008