Устранение неполадок с языком MIDL 3.0

Приведенная ниже таблица признаков и способов их устранения может быть полезна при создании кода и переносе существующего приложения.

Примечание

назначение язык MIDL (MIDL) 3,0 заключается в определении среда выполнения Windows типов в файлах IDL ( .idl файлы языка определения интерфейса). MIDL 3,0 — это очень удобный способ определения классов среды выполнения C++/WinRT . Дополнительные сведения и фон см. в статье Введение в язык MIDL 3,0.

Для определения типов COM традиционно использовались IDL-файлы. Таким образом, MIDL 3,0 представляет новый и другой способ использования IDL-файлов с расширенным синтаксисом для них. дополнительные сведения об использовании IDL-файлов для определения типов, отличных от среда выполнения Windows (типов COM), см. в разделе язык MIDL.

Признаки и способы устранения неполадок

Симптом Средство
компиляция в Visual Studio приводит кошибке "error MIDL2003: [msg] redefinition [context]: IUnknown" и многим другим похожим ошибкам. Цепочки инструментов настроен на автоматическое создание ссылок на любые типы в пространствах имен System. в файлах IDL удалите все import директивы для Windows пространств имен. вам потребуется import только те типы, которые определены в проекте.
Ошибка MIDL2009: [MSG] неопределенный символ [context]: IInspectable. Цепочки инструментов не настроен на автоматическое импортирование типов в пространствах имен System. Если вы используете midl.exe из командной строки, то ознакомьтесь со структурой определения и вызовите midl.exe из командной строки для правильного синтаксиса командной строки, в частности, с помощью /reference параметра. кроме того, скомпилируйте файлы IDL с помощью Visual Studio с расширением c++/WinRT Visual Studio (vsix) (см. раздел поддержка Visual Studio для c++/WinRT и vsix). Если вы выполните какие-либо из этих действий, вам не потребуется добавлять import директиву для Windows.Foundation.idl в IDL-файл. Но вам потребуется import директива для импорта дополнительного IDL, если вы ссылаетесь на типы, определенные в проекте.
Ошибка MIDL2011: [MSG] неразрешенное объявление типа [context]:, за которым следует имя типа. В IDL-файле добавьте import директиву для IDL-файлов, содержащих определения любых типов, на которые вы ссылаетесь в проекте.
Ошибка MIDL2025: [MSG] синтаксическая ошибка [context]: ожидается > или, NEAR " >> " Вставьте пробел между двумя > символами, чтобы пара символов, закрывающих шаблон, не была неправильно интерпретирована как оператор сдвига вправо.
Ошибка MIDL2025: [MSG] синтаксическая ошибка [context]: ожидается > или, рядом с "[" Эта ошибка может возникать при использовании массива в качестве аргумента типа параметра для параметризованного интерфейса. Это недопустимо. Но дополнительные сведения и возможное решение см. в разделе параметризованные типы.
Тесты комплекта сертификации приложений для Windows создают ошибку о том, что один из ваших классов среды выполнения "не является производным от базового класса Windows. Все составные классы должны наследоваться от типа в пространстве имен Windows". Любой класс среды выполнения (определяемый в приложении), производный от базового класса, называется классом, поддерживающим композицию . Исходный базовый класс для составного класса должен быть типом из пространства имен Windows.*, например, Windows.UI.Xaml.DependencyObject. Дополнительные сведения см. в статье Элементы управления XAML; привязка к свойству C++/WinRT.
компиляция в Visual Studio приводит квозникновению ошибки "ошибка MIDL5148: [msg]" классические конструкции IDL winrt не могут использоваться в современных типах idl-типов winrt". Вы используете синтаксис MIDL 1,0 или 2,0 в файле MIDL 3,0. Дополнительные сведения см. в разделе MIDL 1,0, 2,0 и 3,0.
MIDL4035 [MSG] параметр [in] имеет недопустимый тип указателя. Некоторые входные параметры передаются указателем, но тип указателя является недопустимым. Обычно это знак, который ref const использовался для типа, не являющегося структурным, или ref использован с типом значения. Обратите внимание, что [in] атрибут, упомянутый в сообщении об ошибке, фактически означает, что ошибка связана с входным параметром, который является любым параметром без out ключевого слова. [in]Сам атрибут не является допустимым атрибутом в MIDL 3,0 и поэтому не отображается в коде.