Определение чистого базового класса с использованием IDL - PullRequest
2 голосов
/ 18 декабря 2008

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

1 Ответ

2 голосов
/ 22 декабря 2008

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

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

...