次の方法で共有


C++/WinRT に関する問題のトラブルシューティング

C++/WinRT Visual Studio Extension (VSIX) (プロジェクト テンプレートのサポートを提供) のインストールと使用については、Visual Studio での C++/WinRTのサポート 参照してください。

このトピックは、すぐに認識できるように前もって説明しています。あなたがまだそれを必要としない場合でも。 以下のトラブルシューティングの症状と解決策の表は、新しいコードをカットする場合でも、既存のアプリを移植する場合でも役立つ場合があります。 移植中で、プロジェクトがビルドされて実行されるステージに進みたいと思っている場合は、問題を引き起こしている重要でないコードをコメントまたはスタブアウトして、その負債を後で返済することで、一時的な進歩を遂げます。

よく寄せられる質問の一覧については、よく寄せられる質問を参照してください。

XAML の問題の追跡

XAML 解析の例外は、特に例外内に意味のあるエラー メッセージがない場合に診断が困難な場合があります。 デバッガーが初回例外をキャッチするように構成されていることを確認します (早い段階で解析例外をキャッチします)。 デバッガーで例外変数を調べて、HRESULT またはメッセージに有用な情報があるかどうかを判断できる場合があります。 また、XAML パーサーによるエラー メッセージの出力については、Visual Studio の出力ウィンドウを確認してください。

アプリが終了し、XAML マークアップの解析中にハンドルされない例外がスローされたことがわかっている場合は、不足しているリソースへの (キーによる) 参照の結果である可能性があります。 または、ユーザーコントロール、カスタムコントロール、またはカスタムレイアウトパネル内で発生する例外である可能性があります。 最後の手段はバイナリ分割です。 XAML ページからマークアップの約半分を削除し、アプリを再実行します。 その後、エラーが削除した半分の内側にあるか(どのような場合でも復元する必要があります)、または削除しなかった半分のエラーかどうかを知ります。 エラーを含む部分を半分に分割してプロセスを繰り返し、問題が特定できるまで続けます。

症状と解決方法

症状 対策
実行時に HRESULT 値が REGDB_E_CLASSNOTREGISTERED で例外がスローされます。 なぜ「クラスが登録されていない」例外が発生するのかを参照してください。」
C++ コンパイラは、"'implements_type' というエラーを生成します。'<投影型>'" の直接的または間接的な基底クラスのメンバーではありません。 これは、あなたの実装型の名前空間なしの名前 (例えばMyRuntimeClass) を使って を作成 (を呼び出し) し、その型のヘッダーファイルを含めていない場合に発生する可能性があります。 コンパイラは 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>として宣言します。 ただし、T が要素型である Windows.Foundation.Collections.IObservableVectorTを実装するオブジェクトを返します。 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 を渡すと発生する可能性があります。 詳細については、「Standard C++ データ型と C++/WinRT」を参照してください。
C++ コンパイラは、"'const std::vector<winrt::hstring,std::allocator<_Ty>>' から 'const winrt::param::async_iterable<winrt::hstring> &' に変換できません" というエラーを生成します。 これは、コレクションを必要とする非同期 Windows ランタイム API に winrt::hstring の std::vector を渡し、ベクターを非同期呼び出し先にコピーしたり移動したりしていない場合に発生する可能性があります。 詳細については、「Standard C++ データ型と C++/WinRT」を参照してください。
プロジェクトを開くと、Visual Studio によって "プロジェクトのアプリケーションがインストールされていません" というエラーが生成されます。 まだインストールしていない場合は、Visual Studio [新しいプロジェクト] ダイアログ内から、Windows Universal Tools for C++ 開発 をインストールする必要があります。 それでも問題が解決しない場合、プロジェクトは C++/WinRT Visual Studio 拡張機能 (VSIX) に依存している可能性があります (C++/WinRTの Visual Studio のサポート 参照)。
Windows アプリ認定キットのテストでは、ランタイム クラスの 1 つ "が Windows 基本クラスから派生しないというエラーが発生します。すべてのコンポーザブル クラスは、最終的に Windows 名前空間の型から派生する必要があります". 基底クラスから派生する (アプリケーションで宣言する) ランタイム クラスは、コンポーザブル クラスと呼ばれます。 コンポーザブル クラスの最終的な基底クラスは、Windows.* 名前空間から生成される型である必要があります。たとえば、Windows.UI.Xaml.DependencyObjectを します。 XAML コントロール 参照してください。詳細については、 C++/WinRT プロパティにバインドします。
C++ コンパイラは、EventHandler または TypedEventHandler デリゲートが特殊化される際に、「T は WinRT 型である必要があります」というエラーを生成します。 winrt::delegate<...T> の使用を検討してください。 C++/WinRTでイベントを作成する を参照してください。
C++ コンパイラは、Windows ランタイムの非同期操作を特殊化する際に、"T は WinRT 型" というエラーを発生させます。 代わりに、並列パターンライブラリ (PPL) のタスク を返すことを検討してください。 コンカレンシーと非同期操作を参照してください。
C++ コンパイラは、winrt::xaml_typenameを呼び出すと、「T は WinRT 型」というエラーを生成します。 winrt::xaml_typename (たとえば、BgLabelControlApp::BgLabelControl使用) で投影型を使用し、実装型 (たとえば、BgLabelControlApp::implementation::BgLabelControlを使用しないでください)。 XAML カスタム (テンプレート化) コントロール を参照してください。
C++ コンパイラでは、"エラー C2220: 警告がエラーとして扱われ、'object' ファイルは生成されません" が生成されます。 警告を修正するか、C/C++ >[一般]>[警告をエラーとして扱う]No (/WX-)に設定します。
C++/WinRT オブジェクトのイベント ハンドラーがオブジェクトが破棄された後に呼び出されるため、アプリがクラッシュします。 イベント処理デリゲートを使用してこの ポインター に安全にアクセスする を参照してください。
C++ コンパイラは「エラー C2338: これは弱い参照サポート専用です」を生成します。 あなたは、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++>言語>準拠モードを「いいえ」に設定します。。さらに、プロジェクトプロパティ C/C++>> の 追加オプション/permissive- が表示される場合、削除してください。
C++ コンパイラによって「エラー C2039: 'IUnknown': は '`global namespace'' のメンバーではありません」が生成されます。 C++/WinRT プロジェクトを Windows SDKの新しいバージョンに再ターゲットする方法」を参照してください。
C++ リンカーは、"エラー LNK2019: 関数_VSDesignerCanUnloadNow@0で参照_WINRT_CanUnloadNow@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::produce<D,I> を生成することができません、GetBindingConnectorが欠如しているため、抽象クラスをインスタンス化することができません。 あなたは #include <winrt/Windows.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>を追加し、を適切なMyNamespaceで置き換えます。
Visual Studio の C++/WinRT プロジェクトでは、IntelliSense によって "エラー E1696:ソース ファイルを開くことができません" という形式のエラーが生成されます。 新しく作成したプロジェクトを少なくとも 1 回コンパイルします。 次に、ソース コード エディターで右クリックして再スキャン >>、その後ファイルを再スキャン。 これで、E1696 を含むすべての IntelliSense エラーが解決されます。

このトピックで質問に答えられなかった場合は、Visual Studio C++ 開発者コミュニティにアクセスするか、Stack Overflowの タグを使用してヘルプを見つけることができます。