次の方法で共有


Microsoft インターフェイス定義言語 3.0 の問題のトラブルシューティング

以下の症状のトラブルシューティングおよび対処法に関する表は、新しいコードを作成しているか既存のアプリを移植しているかにはかかわらず役立つ可能性があります。

Note

Microsoft インターフェイス定義言語 (MIDL) 3.0 の目的は、インターフェイス定義言語 (IDL) ファイル ( .idl ファイル) 内の Windows ランタイム型を定義することです。 MIDL 3.0 は、 C++/WinRT ランタイムクラスを定義するために特に便利な方法です。 詳細と背景については、「 Microsoft インターフェイス定義言語3.0 の概要」を参照してください。

IDL ファイルは、従来は COM 型を定義するために使用されていました。したがって、MIDL 3.0 は、拡張された構文で、IDL ファイルを使用するための新しい別の方法を表します。 IDL ファイルを使用して非 Windows ランタイム型 (COM 型) を定義する方法の詳細については、「 Microsoft インターフェイス定義言語」を参照してください。

現象と対処法

症状 解決方法
Visual Studio でコンパイルすると、"error MIDL2003: [msg] 再定義 [context]: IUnknown" とその他の多くの同様のエラーが発生します。 ツールチェーンは、システム名前空間にある任意の型を自動的に参照するように設定されています。 IDL ファイルで Windows 名前空間のディレクティブをすべて import 削除します。必要な import のは、プロジェクトで定義したすべての型だけです。
エラー MIDL2009: [msg] 未定義のシンボル [context]: IInspectable ツールチェーンは、システム名前空間の型を自動的にインポートするようには設定されて いません 。 コマンドラインからを使用して midl.exe いる場合は、「定義の構造」を参照し、正しいコマンドライン構文の コマンドラインから midl.exe を呼び出し ます。具体的には、スイッチを使用 /reference します。 または、c++/winrt Visual Studio Extension (vsix) を使用して Visual Studio を使用して IDL ファイルをコンパイルします (「 c++/winrt および vsix のサポートの Visual Studio」を参照してください)。 これらのいずれかを実行する場合は、の Windows.Foundation.idl ディレクティブを IDL ファイルに追加 import する必要はありません。 ただし、プロジェクトで定義した型を参照している場合は、追加の IDL をインポートするためにディレクティブが必要 importなります。
エラー MIDL2011: [msg] 未解決の型宣言 [context]:、その後に型名が続きます。 IDL ファイルで、プロジェクトで定義した任意の型の定義が含まれている IDL ファイルのディレクティブを追加 import します (s)。
エラー MIDL2025: [msg] 構文エラー [context]: またはが必要 > ですが、" >> " の近くにあります。 2つ > の文字の間にスペースを挿入して、テンプレート終了文字のペアが誤って右シフト演算子として解釈されないようにします。
エラー MIDL2025: [msg] 構文エラー [context]: またはが必要 > ですが、"[" の近くにあります。 このエラーは、パラメーター化されたインターフェイスのパラメーター型引数として配列を使用した場合に発生する可能性があります。 これは有効ではありません。 しかし、詳細および考えられる解決策については、「 パラメーター化型」を参照してください。
Windows アプリ認定キットのテストが、ランタイム クラスの 1 つについて、"Windows 基底クラスから派生しません。すべての構成可能クラスは最終的に、Windows 名前空間内の型から派生する必要があります" というエラーを生成します。 基底クラスから派生したランタイムクラス (アプリケーションで定義したもの) は、 コンポーザブル なクラスと呼ばれます。 構成可能クラスの最終的な基底クラスは、Windows.* 名前空間からの型でなければなりません (例: Windows.UI.Xaml.DependencyObject)。 詳細情報については、「XAML コントロール: C++/WinRT プロパティへのバインド」を参照してください。
Visual Studio の結果としてコンパイルすると、"error MIDL5148: [msg] Classic 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 の有効な属性ではないため、コードには表示されません。