Note
C++/WinRT Visual Studio拡張機能 (VSIX) (プロジェクト テンプレートのサポートを提供) のインストールと使用については、C++/WinRT のサポートVisual Studio参照してください。
このトピックは、すぐに認識できるように前もって説明しています。あなたがまだそれを必要としない場合でも。 以下のトラブルシューティングの症状と解決策の表は、新しいコードをカットする場合でも、既存のアプリを移植する場合でも役立つ場合があります。 移植中で、プロジェクトがビルドされて実行されるステージに進みたいと思っている場合は、問題を引き起こしている重要でないコードをコメントまたはスタブアウトして、その負債を後で返済することで、一時的な進歩を遂げます。
よく寄せられる質問の一覧については、「よく寄せられる 質問」を参照してください。
XAML の問題の追跡
XAML 解析の例外は、特に例外内に意味のあるエラー メッセージがない場合に診断が困難な場合があります。 デバッガーが初回例外をキャッチするように構成されていることを確認します (早い段階で解析例外をキャッチします)。 デバッガーで例外変数を調べて、HRESULT またはメッセージに有用な情報があるかどうかを判断できる場合があります。 また、VISUAL STUDIOの出力ウィンドウで、XAML パーサーによるエラー メッセージの出力を確認します。
アプリが終了し、XAML マークアップの解析中に未処理の例外がスローされたことしかわからない場合、その原因は、存在しないリソースへの (キーによる) 参照にある可能性があります。 あるいは、UserControl、カスタム コントロール、またはカスタム レイアウトパネル内部でスローされた例外である可能性もあります。 最後の手段はバイナリ分割です。 XAML ページからマークアップの約半分を削除し、アプリを再実行します。 その後、エラーが削除した半分の内側にあるか(どのような場合でも復元する必要があります)、または削除しなかった半分のエラーかどうかを知ります。 エラーを含む半分を分割する、という手順を繰り返し、最終的に問題箇所を特定するまで続けます。
症状と解決方法
| 症状: | 対処法 |
|---|---|
| 実行時に、HRESULT 値 REGDB_E_CLASSNOTREGISTERED を伴う例外がスローされます。 | 「クラスが登録されていません」例外が発生する理由を参照してください。 |
| C++ コンパイラは、"'implements_type': '<projected type>' の直接的または間接的な基底クラスのメンバーではありません" というエラーを生成します。 | これは、実装型の名前空間で修飾されていない名前 (MyRuntimeClass など) を使用して make を呼び出し、その型のヘッダーを含めていない場合に発生する可能性があります。 コンパイラは MyRuntimeClass を投影型として解釈します。 解決策は、実装の種類 (MyRuntimeClass.hなど) のヘッダーを含める方法です。 |
| C++ コンパイラは、"削除された関数を参照しようとしています" というエラーを生成します。 | これは、 make を呼び出し、テンプレート パラメーターとして渡す実装型に既定のコンストラクターが = delete 場合に発生する可能性があります。 実装の種類のヘッダー ファイルを編集し、 = delete を = defaultに変更します。 ランタイム クラスの IDL にコンストラクターを追加することもできます。 |
| INotifyPropertyChanged を実装しましたが、XAML バインドが更新されていません (UI が PropertyChanged をサブスクライブしていません)。 | XAML マークアップでバインド式に Mode=OneWay (または TwoWay) を設定することを忘れないでください。
XAML コントロールを参照し、C++/WinRT プロパティにバインドします。 |
| XAML の項目コントロールをオブザーバブル コレクションにバインドしたところ、実行時に「パラメーターが正しくありません」というメッセージの例外が発生しています。 | IDL および実装では、任意の監視可能コレクションを型 Windows.Foundation.Collections.IVector<IInspectable> として宣言します。 ただし、Windows.Foundation.Collections.IObservableVector<T> を実装するオブジェクトを返します。ここで、T は要素の型です。 XAML 項目コントロールを参照し、C++/WinRT コレクションにバインドします。 |
| C++ コンパイラは、"'MyImplementationType_base<MyImplementationType>': 使用できる適切な既定のコンストラクターがありません" という形式のエラーを生成します。 | これは、単純でないコンストラクターを持つ型から派生した場合に発生する可能性があります。 派生型のコンストラクターは、基本型のコンストラクターに必要なパラメーターを渡す必要があります。 有効な例については、「 単純でないコンストラクターを持つ型からの派生」を参照してください。 |
| C++ コンパイラは、「'const std::vector<std::wstring,std::allocator<_Ty>>' から 'const winrt::param::async_iterable<winrt::hstring> &' へ変換できません」というエラーを出力します。 | これは、コレクションを必要とするWindows ランタイム API に std::wstring の std::vector を渡すと発生する可能性があります。 詳細については、 標準の C++ データ型と C++/WinRT に関するページを参照してください。 |
| C++ コンパイラは、 「'const std::vector<winrt::hstring,std::allocator<_Ty>>' から 'const winrt::param::async_iterable<winrt::hstring> &'への変換はできません」というエラーを出力します。 | これは、winrt::hstring の std::vector をコレクションを必要とする非同期Windows ランタイム API に渡し、ベクターを非同期呼び出し先にコピーまたは移動していない場合に発生する可能性があります。 詳細については、 標準の C++ データ型と C++/WinRT に関するページを参照してください。 |
| プロジェクトを開くと、Visual Studioは "プロジェクトのアプリケーションがインストールされていません" というエラーを生成します。 | まだインストールしていない場合は、Windows アプリ SDK C++ テンプレートと C++/WinRT Visual Studio拡張機能 (VSIX) をインストールする必要があります (C++/WinRT のサポートVisual Studio参照)。 |
| Windows アプリ認定キットのテストでは、ランタイム クラスの 1 つが "Windows 基底クラスから派生していない" というエラーが発生します。すべての構成可能なクラスは、最終的にWindows名前空間の型から派生する必要があります。 | 基底クラスから派生する (アプリケーションで宣言する) ランタイム クラスは、 コンポーザブル クラスと呼ばれます。 コンポーザブル クラスの最終的な基底クラスは、Windows.* 名前空間または Microsoft.* 名前空間 (たとえば、Microsoft) に由来する型である必要があります。Ui。Xaml.DependencyObject。 詳細については、 XAML コントロール、C++/WinRT プロパティへのバインド に関するページを参照してください。 |
| C++ コンパイラは、EventHandler または TypedEventHandler デリゲートの特殊化に対して "T は WinRT 型である必要があります" というエラーを生成します。 | 代わりにwinrt::delegate<...T>の使用を検討してください。 C++/WinRT でイベントを作成するを参照してください。 |
| C++ コンパイラは、Windows ランタイム非同期操作の特殊化に対して "T は WinRT 型である必要があります" というエラーを生成します。 | 代わりに並列パターン ライブラリ (PPL) タスク を返す方法を検討してください。 コンカレンシー操作と非同期操作に関する説明を参照してください。 |
| winrt::xaml_typename を呼び出すと、C++ コンパイラによって "T は WinRT 型である必要があります" というエラーが生成されます。 | winrt::xaml_typename で投影型を使用します (たとえば、BgLabelControlApp::BgLabelControl を使用します)。実装型ではなく (たとえば、BgLabelControlApp::implementation::BgLabelControl を使用しないでください)。 XAML カスタム (テンプレート化) コントロールを参照してください。 |
| C++ コンパイラでは、"エラー C2220: 警告はエラーとして扱われ、'object' ファイルは生成されません" が生成されます。 | 警告を修正するか、C/C++>General>警告をエラーとして扱う を No (/WX-) に設定します。 |
| C++/WinRT オブジェクトのイベント ハンドラーがオブジェクトが破棄された後に呼び出されるため、アプリがクラッシュします。 | イベント処理デリゲートを使用してこのポインターに安全にアクセスする方法を参照してください。 |
| C++ コンパイラでは、"エラー C2338: これは弱い ref サポートのみを対象としています" が生成されます。 | winrt::no_weak_ref マーカー構造体をテンプレート引数として基底クラスに渡した型の弱参照を要求しています。 弱参照サポートのオプトアウトを参照してください。 |
| C++ コンパイラでは、"consume_Something: 'auto' を返す関数を定義する前に使用できません" が生成されます。 | C3779 を参照してください。コンパイラから "consume_Something: 'auto' を返す関数を定義する前に使用できません" というエラーが表示されるのはなぜですか? |
| C++ リンカーが "エラー LNK2019: 未解決の外部シンボル" を生成する | リンカーで「LNK2019: 未解決の外部シンボル」エラーが表示されるのはなぜですか?を参照してください。 |
| LLVM および Clang ツールチェーンは、C++/WinRT で使用するとエラーを生成します。 | C++/WinRT 用の LLVM および Clang ツールチェーンはサポートされていませんが、内部での使用方法をエミュレートする場合は、「 LLVM/Clang を使用して C++/WinRT でコンパイルできますか?」で説明されているような実験を試すことができます。 |
| C++ コンパイラは、投影された型に対して "使用できる適切な既定のコンストラクターがありません" を生成します。 | ランタイム クラス オブジェクトの初期化を遅延させる場合、または同じプロジェクトでランタイム クラスを使用して実装する場合は、 std::nullptr_t コンストラクターを呼び出す必要があります。 詳細については、「 C++/WinRT で API を使用する」を参照してください。 |
| C++ コンパイラでは、"エラー C3861: 'from_abi': 識別子が見つかりません"、および base.h で発生したその他のエラーが生成されます。 このエラーは、Visual Studio 2017 (バージョン 15.8.0 以降) を使用していて、Windows SDK バージョン 10.0.17134.0 (Windows 10 バージョン 1803) を対象としている場合に表示されることがあります。 | Windows SDK の新しい (より準拠した) バージョンをターゲットにするか、プロジェクト プロパティ C/C++>Language>Conformance モードを設定します(また、/permissive- がプロジェクト プロパティ C/C++>Language>Command Line の [追加オプション] の下に表示される場合は削除します)。 |
| C++ コンパイラは、"error C2039: 'IUnknown': is not a member of '`global namespace''" を出力します。 | C++/WinRT プロジェクトを新しいバージョンの Windows SDK に再ターゲットする方法を参照してください。 |
| C++ リンカーは、"エラー LNK2019: 未解決の外部シンボル _WINRT_CanUnloadNow@0 が関数 _VSDesignerCanUnloadNow@0 で参照されました" を出力します。 | C++/WinRT プロジェクトを新しいバージョンの Windows SDK に再ターゲットする方法を参照してください。 |
| ビルド プロセスによってエラー メッセージが生成されます。C++/WinRT VSIX ではプロジェクト ビルドのサポートが提供されなくなりました。プロジェクト参照を Microsoft.Windows に追加してください。CppWinRT Nuget パッケージ。 | Microsoft.Windows.CppWinRT NuGet パッケージをプロジェクトにインストールします。 詳細については、 VSIX 拡張機能の以前のバージョンを参照してください。 |
| C++ リンカーは、エラー LNK2019: 未解決の外部シンボルを、winrt::impl::consume_Windows_Foundation_Collections_IVector への言及を伴って出力します。 |
C++/WinRT 2.0 以降、Windows ランタイム コレクションで範囲ベースのforを使用している場合は、#include <winrt/Windows.Foundation.Collections.h>する必要があります。 |
| C++ コンパイラでは、"エラー C4002: 関数のようなマクロ呼び出しの引数が多すぎます GetCurrentTime" が生成されます。 | GetCurrentTime または TRY を使用してあいまいさを解決する方法を参照してください。 |
| C++ コンパイラでは、"エラー C2334: '{' の前に予期しないトークンが発生します。明らかな関数本体をスキップしています"。 | GetCurrentTime または TRY を使用してあいまいさを解決する方法を参照してください。 |
| C++ コンパイラでは、"winrt::impl::p roduce<D,I> は、GetBindingConnector がないため抽象クラスをインスタンス化できません" が生成されます。 |
#include <winrt/Microsoft.UI.Xaml.Markup.h>する必要があります。 |
| C++ コンパイラが、"エラー C2039: 'promise_type': 'std::experimental::coroutine_traits<void>' のメンバーではありません" というエラーを生成します。 | コルーチンは、非同期操作オブジェクトまたは winrt::fire_and_forget を返す必要があります。 コンカレンシー操作と非同期操作に関する説明を参照してください。 |
| プロジェクトで "'PopulatePropertyInfoOverride' へのあいまいなアクセス" が生成されます。 | このエラーは、IDL で 1 つの基底クラスを宣言し、XAML マークアップで別の基底クラスを宣言すると発生する可能性があります。 |
| C++/WinRT ソリューションを初めて読み込むと、"プロジェクト 'MyProject.vcxproj' 構成 'Debug|x86' の Designtime ビルドに失敗しました。IntelliSense が使用できない可能性があります。"。 | この IntelliSense の問題は、初めてビルドした後に解決されます。 |
| デリゲートを登録するときに winrt::auto_revoke を指定しようとすると、 winrt::hresult_no_interface 例外が生成されます。 | 自動取り消しデリゲートが登録に失敗した場合を参照してください。 |
| C++/WinRT アプリでは、XAML を使用する C# Windows ランタイム コンポーネントを使用すると、コンパイラによって "'MyNamespace_XamlTypeInfo': は 'winrt::MyNamespace' のメンバーではないという形式のエラーが生成されます。ここで、MyNamespace はWindows ランタイム コンポーネントの名前空間の名前です。 | 使用している C++/WinRT アプリのpch.hで、必要に応じて #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h> を置き換えるを追加します。 |
| Visual Studioの C++/WinRT プロジェクトでは、IntelliSense によって "エラー E1696: ファイルをオープンソースできません" という形式のエラーが生成されます。 | 新しく作成したプロジェクトを少なくとも 1 回コンパイルします。 次に、ソース コード エディターの >Rescan>Rescan ファイルを右クリックします。 これで、E1696 を含むすべての IntelliSense エラーが解決されます。 |
Note
このトピックで質問に答えられなかった場合は、Visual Studio C++ 開発者コミュニティにアクセスするか、Stack Overflow の c++-winrt タグを使用してヘルプを見つけることができます。
関連トピック
Note
多くの C++/WinRT トピックは、UWP ドキュメントからこのセクションに移行中です。 移行が完了するまで、以下の一覧のリンクが UWP ドキュメント セクションにつながる可能性があります。 C++/WinRT 言語プロジェクションは、UWP アプリと WinUI 3 アプリの両方で同じであるため、コンテンツは両方のコンテキストで適用できます。 UWP 固有のパターン (アプリのライフサイクルや Windows.UI 名前空間 API など) は、これらの記事に明示的に記載されています。
Windows developer