排查 Microsoft 接口定义语言 3.0 问题

无论你是要削减新代码还是要移植现有应用,下面的症状排查和补救措施表都可能对你有帮助。

注意

Microsoft 接口定义语言 (MIDL) 3.0 的目的是在接口定义语言中定义 Windows 运行时类型 (IDL .idl) 文件 (文件) 。 MIDL 3.0 是一种定义 c + +/WinRT 运行时类的特别方便的方式。 有关详细信息和背景,请参阅 Microsoft 接口定义语言3.0 的简介

IDL 文件通常用于定义 COM 类型;因此,MIDL 3.0 表示一种新的不同方式,使用 IDL 文件,其中包含扩展的语法。 有关使用 IDL 文件定义) (COM 类型的非 Windows 运行时类型的详细信息,请参阅Microsoft 接口定义语言

症状和补救方法

症状 纠正方法
在 Visual Studio 中进行编译将导致出现 "错误 MIDL2003: [msg] 重定义 [context]: IUnknown" 以及许多其他类似错误。 工具链设置为自动引用系统命名空间中的所有类型。 在 IDL 文件中,删除对 Windows 命名空间的任何 import 指令; 只需要 import 在项目中定义的任何类型。
错误 MIDL2009: [msg] 未定义的符号 [context]: IInspectable 将工具链设置为自动导入系统命名空间中的类型。 如果使用 midl.exe 的是命令行中的,请参阅 定义结构,并从命令行调用 midl.exe ,以获取正确的命令行语法; 具体而言,是使用 /reference 开关。 或者,使用 Visual Studio,使用 c + +/WinRT Visual Studio 扩展 (VSIX) 来编译 IDL 文件 (请参阅c + +/WinRT 的 Visual Studio 支持和 vsix) 。 如果执行了上述任何操作,则无需为 IDL 文件添加 import 指令 Windows.Foundation.idl 。 但如果引用的是在项目中定义的类型, 则需要import 指令导入其他 IDL。
错误 MIDL2011: [msg] 未解析的类型声明 [context]:,后跟类型名称。 在 IDL 文件中,为 IDL 文件添加一个 import 指令, (s) 包含已在项目中定义的任何类型 () 的定义。
错误 MIDL2025: [msg] 语法错误 [context]:应 > 为或,接近 " >> " 在两 > 个字符之间插入一个空格,以便不将模板结束字符对解释为右移位运算符。
错误 MIDL2025: [msg] 语法错误 [context]:应 > 为或,接近 "[" 如果使用数组作为参数化接口的参数类型参数,则会出现此错误。 这样做是无效的。 但有关更多详细信息和潜在的解决方案,请参阅 参数化类型
Windows 应用认证工具包测试将产生一个错误,表示一个运行时类“不是派生自 Windows 基类。所有可组合类必须最终派生自 Windows 命名空间中的类型”。 在应用) 程序中定义的任何从基类派生的运行时类 (称为可 组合 的类。 可组合类的最终基类必须是源自 Windows.* 命名空间的类型;例如,Windows.UI.Xaml.DependencyObject。 有关更多详细信息,请参阅 XAML 控件;绑定到 C++/WinRT 属性
在 Visual Studio 中进行编译将导致出现 "错误 MIDL5148: [msg] 经典 winrt idl 构造不能用于新式 winrt idl 类型"。 您正在 MIDL 3.0 文件中使用 MIDL 1.0 或2.0 语法。 有关背景信息,请参阅 MIDL 1.0、2.0 和 3.0
MIDL4035 [msg] "[in]" 参数具有无效的指针类型。 某些输入参数由指针传递,但指针的类型无效。 这通常是与非结构类型一起使用的符号,或 ref 与值类型一起使用的符号 ref const 。 请注意,错误消息中提到的 [in] 属性实际上表示错误涉及到输入参数,该参数是不带关键字的 out 任何参数。 [in]特性本身在 MIDL 3.0 中不是有效的属性,因此不会显示在代码中。