Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Poznámka:
Informace o instalaci a použití rozšíření sady Visual Studio C++/WinRT (VSIX) (která poskytuje podporu šablon projektu) najdete v tématu Podpora sady Visual Studio pro C++/WinRT.
Toto téma je předem, abyste o něm okamžitě věděli; i když ho ještě nepotřebujete. Následující tabulka s příznaky řešení potíží a nápravnými prostředky může být užitečná bez ohledu na to, jestli odstraňujete nový kód nebo portujete existující aplikaci. Pokud provádíte přenos a chcete se posunout dopředu a dostat se do fáze, ve které se váš projekt sestaví a běží, můžete provést dočasný pokrok tím, že zakomentujete nebo nahradíte jakýkoli nepotřebný kód, který způsobuje problémy, a později se k němu můžete vrátit a vyřešit ho.
Seznam nejčastějších dotazů najdete v tématu Nejčastější dotazy.
Sledování problémů s XAML
Diagnostika výjimek analýzy XAML může být obtížná – zejména pokud v rámci výjimky neexistují žádné smysluplné chybové zprávy. Ujistěte se, že je ladicí program nakonfigurován tak, aby zachytával výjimky při prvním výskytu (snažit se zachytit výjimku analýzy co nejdříve). Můžete zkontrolovat proměnnou výjimky v ladicím programu, abyste zjistili, zda HRESULT nebo zpráva obsahují nějaké užitečné informace. V okně výstupu sady Visual Studio zkontrolujte také chybové zprávy výstupu analyzátoru XAML.
Pokud se vaše aplikace ukončí a víte pouze, že během analýzy značek XAML byla vyvolána neošetřená výjimka, může to být způsobeno odkazem (podle klíče) na chybějící prostředek. Nebo to může být výjimka vyvolaná uvnitř UserControl, vlastního ovládacího prvku nebo vlastního panelu rozložení. Poslední možnost je binární rozdělení. Odeberte asi polovinu markupu ze stránky XAML a aplikaci znovu spusťte. Pak budete vědět, jestli je chyba někde uvnitř poloviny, kterou jste odebrali (kterou byste teď měli v každém případě obnovit) nebo v polovině, kterou jste ponechali. Opakujte proces tím, že rozdělíte tu část, která obsahuje chybu, a pokračujte, dokud přesně neurčíte problém.
Příznaky a léky
| Příznaky | Lék |
|---|---|
| Během běhu programu se vyvolá výjimka s hodnotou HRESULT REGDB_E_CLASSNOTREGISTERED. | Podívejte se na Proč dostávám výjimku "třída není zaregistrovaná"?. |
| Kompilátor jazyka C++ vytvoří chybu "implements_type": není členem žádné přímé nebo nepřímé základní třídy "<projektovaného typu>". | K tomu může dojít, když zavoláte vytvořit s nekompletním názvem vašeho typu implementace (MyRuntimeClass, například), a pokud jste nezahrnuli hlavičku tohoto typu. Kompilátor interpretuje MyRuntimeClass jako projektovaný typ. Řešením je zahrnout hlavičku pro váš typ implementace (MyRuntimeClass.hnapříklad). |
| Chybové hlášení kompilátoru jazyka C++ „pokus o odkaz na odstraněnou funkci“. | K tomu může dojít při volání funkce a pokud typ implementace, který předáte jako parametr šablony, má = delete výchozí konstruktor. Upravte soubor hlaviček typu implementace a změňte = delete na = default. Můžete také přidat konstruktor do IDL pro třídu runtime. |
| Implementovali jste INotifyPropertyChanged, ale vaše vazby XAML se neaktualizují (a uživatelské rozhraní není přihlášeno k odběru PropertyChanged). | Nezapomeňte nastavit Mode=OneWay (nebo TwoWay) ve výrazu vazby v kódu XAML. Podívejte se na ovládací prvky XAML; připojte k vlastnosti C++/WinRT. |
| Při vazbě XAML prvku pro položky na pozorovatelnou kolekci je při běhu programu vyvolána výjimka se zprávou "Parametr je nesprávný". | V IDL a vaší implementaci deklarujte jakoukoli pozorovatelnou kolekci jako typ Windows.Foundation.Collections.IVector<IInspectable>. Vraťte objekt, který implementuje Windows.Foundation.Collections.IObservableVector<T>, kde T je váš typ prvku. Viz ovládací prvky položek XAML; připojte k C++/WinRT kolekci. |
| Kompilátor jazyka C++ vytvoří chybu formuláře "'MyImplementationType_base<MyImplementationType>': není k dispozici žádný vhodný výchozí konstruktor". | K tomu může dojít v případě, že jste odvozeni od typu, který má ne triviální konstruktor. Konstruktor odvozeného typu musí předávat parametry, které konstruktor základního typu potřebuje. Pro zpracovaný příklad viz Odvození od typu, který má netriviální konstruktor. |
| Kompilátor C++ vytvoří chybu "nelze převést z 'const std::vector<std::wstring,std::allocator<_Ty>>' na 'const winrt::param::async_iterable<winrt::hstring> &'". | K tomu může dojít, když předáte std::vector typu std::wstring do rozhraní API prostředí Windows Runtime, které očekává kolekci. Pro další informace viz datové typy standardu C++ aC++/WinRT. |
| Kompilátor C++ vytvoří chybu "nelze převést z 'const std::vector<winrt::hstring,std::allocator<_Ty>>' na 'const winrt::param::async_iterable<winrt::hstring> &'". | K tomu může dojít, když předáte std::vector winrt::hstring asynchronnímu rozhraní API prostředí Windows Runtime, které očekává kolekci, a ani jste nekopírovali ani přesunuli vektor do asynchronního volaného. Pro další informace viz datové typy standardu C++ aC++/WinRT. |
| Při otevření projektu sada Visual Studio zobrazí chybu "Aplikace pro projekt není nainstalována". | Pokud jste to ještě neudělali, musíte nainstalovat Windows Universal tools pro vývoj v jazyce C++ z dialogu Nový projekt v rámci sady Visual Studio. Pokud se tím problém nevyřeší, může projekt záviset na rozšíření sady Visual Studio C++/WinRT (VSIX) (viz podpora sady Visual Studio pro C++/WinRT. |
| Testy sady Windows App Certification Kit vytvářejí chybu, že jedna z vašich tříd modulu runtime „“ nepochází ze základní třídy Windows. Všechny třídy, které lze kompilovat, musí být nakonec odvozeny z typu v oboru názvů Windows „“. | Každá třída runtime, kterou deklarujete ve své aplikaci a která je odvozena ze základní třídy, se označuje jako kompozovatelná třída. Konečná základní třída kompozovatelné třídy musí být typ pocházející z oboru názvů Windows.* Například Windows.UI.Xaml.DependencyObject. Viz ovládací prvky XAML, pro vazbu na vlastnost C++/WinRT podrobnosti naleznete. |
| Kompilátor C++ vytváří chybu "T musí být typu WinRT" pro specializaci delegáta EventHandler nebo TypedEventHandler. | Zvažte použití winrt::delegate<...T> místo toho. Viz události Author v jazyce C++/WinRT. |
| Kompilátor jazyka C++ vytvoří chybu typu "T musí být typu WinRT" pro specializaci asynchronní operace prostředí Windows Runtime. | Místo toho zvažte vrácení úlohy knihovny PPL (Parallel Patterns Library) . Viz Souběžnost a Asynchronní operace. |
| Kompilátor jazyka C++ vygeneruje chybu „T musí být typu WinRT“, když voláte winrt::xaml_typename. | Použijte projektovaný typ s winrt::xaml_typename (například použijte BgLabelControlApp::BgLabelControl) a ne typ implementace (například nepoužívejte BgLabelControlApp::implementation::BgLabelControlControl). Podívejte se na vlastní ovládací prvky XAML (šablonované) . |
| Kompilátor C++ vytvoří chybu C2220: upozornění, které se považuje za chybu – negenerovaný soubor objektu. | Opravte upozornění nebo nastavte C/C++>Obecné>Nastavit upozornění jako chyby na Ne (/WX-). |
| Vaše aplikace zkolabuje, protože se obslužná rutina v objektu C++/WinRT volá po zničení objektu. | Viz Bezpečný přístup k tento ukazatel s delegátem pro zpracování událostí. |
| Kompilátor C++ vytvoří chybu C2338: Toto je pouze pro slabou podporu ref. | Požadujete slabý odkaz na typ, který předal strukturu značky winrt::no_weak_ref jako argument šablony do své základní třídy. Viz Odhlášení ze slabé referenční podpory. |
| Kompilátor jazyka C++ vytvoří "consume_Something: funkce, která vrací "auto" nelze použít před jeho definováním. | Viz C3779: Proč mi kompilátor dává chybu "consume_Something: funkce, která vrací 'auto', nemůže být použita před jejím definováním"?. |
| Linker jazyka C++ vytvoří chybu LNK2019: Nevyřešený externí symbol. | Viz Proč mi linker hlásí chybu "LNK2019: Nevyřešený externí symbol"?. |
| V sadě nástrojů LLVM a Clang dojde k chybám při použití s C++/WinRT. | Nepodporujeme sadu nástrojů LLVM a Clang pro C++/WinRT, ale pokud byste chtěli emulovat, jak ho interně používáme, mohli byste zkusit experiment, jako je ten, který je popsaný v části Můžu použít LLVM/Clang ke kompilaci pomocí C++/WinRT?. |
| Kompilátor jazyka C++ zobrazí chybu "žádný vhodný výchozí konstruktor není dostupný", pokud se jedná o projektovaný typ. | Pokud se pokoušíte zpozdit inicializaci objektu třídy runtime nebo použít a implementovat třídu runtime ve stejném projektu, budete muset volat std::nullptr_t konstruktor. Další informace najdete v tématu Používání rozhraní API pomocí C++/WinRT. |
| Kompilátor C++ vytvoří chybu C3861: from_abi: identifikátor nebyl nalezen a další chyby pocházející ze base.h. Tato chyba se může zobrazit, pokud používáte Visual Studio 2017 (verze 15.8.0 nebo novější) a cílíte na Sadu Windows SDK verze 10.0.17134.0 (Windows 10 verze 1803). | Buď cílujte novější (konformnější) verzi sady Windows SDK, nebo nastavte vlastnost projektu C/C++>Jazyka>Režim shody: Ne (pokud se také objeví /permissive- ve vlastnosti projektu C/C++>Jazyk>Příkazový řádek pod Další možnosti, pak ho odstraňte). |
| Kompilátor C++ vytvoří chybu C2039: IUnknown: není členem globálního oboru názvů. | Viz Jak změnit cílení projektu C++/WinRT na novější verzi sady Windows SDK. |
| Linkovací program jazyka C++ generuje chybuLNK2019: nevyřešený externí symbol _WINRT_CanUnloadNow@0, který je odkazován ve funkci _VSDesignerCanUnloadNow@0. | Viz Jak změnit cílení projektu C++/WinRT na novější verzi sady Windows SDK. |
| Proces sestavení vytvoří chybovou zprávu C++/WinRT VSIX už neposkytuje podporu sestavení projektu. Přidejte odkaz na projekt do balíčku NuGet Microsoft.Windows.CppWinRT. | Nainstalujte Microsoft.Windows.CppWinRT balíček NuGet do projektu. Podrobnosti o dřívějších verzích rozšíření VSIXnajdete v |
| Linker jazyka C++ vytvoří chybu LNK2019: nevyřešený externí symbol, se zmínkou winrt::impl::consume_Windows_Foundation_Collections_IVector. | Od C++/WinRT 2.0, pokud používáte rozsahově založené for v kolekci prostředí Windows Runtime, budete teď muset #include <winrt/Windows.Foundation.Collections.h>. |
| Kompilátor C++ vytvoří chybu C4002: Příliš mnoho argumentů pro vyvolání makra podobného funkci GetCurrentTime. | Podívejte se, jak vyřešit nejednoznačnosti pomocí GetCurrentTime a/nebo TRY? |
| Kompilátor C++ vytvoří chybu „C2334: neočekávané tokeny předcházející '{'; přeskakuje zjevné tělo funkce“. | Podívejte se, jak vyřešit nejednoznačnosti pomocí GetCurrentTime a/nebo TRY? |
| Kompilátor C++ vytvoří "winrt::impl::produce<D,I> nemůže vytvořit instanci abstraktní třídy, protože chybí GetBindingConnector". | Musíte #include <winrt/Windows.UI.Xaml.Markup.h>. |
| Kompilátor C++ vytvoří "chybu C2039: 'promise_type': není členem 'std::experimental::coroutine_traits<void>'". | Korutin musí vrátit buď asynchronní objekt operace, nebo winrt::fire_and_forget. Viz Souběžnost a Asynchronní operace. |
| Váš projekt produkuje „nejednoznačný přístup 'PopulatePropertyInfoOverride'“. | K této chybě může dojít, když deklarujete jednu základní třídu v IDL a jinou základní třídu v kódu XAML. |
| Při prvním načtení řešení C++/WinRT došlo k chyběsestavení Designtime selhalo pro konfiguraci projektu MyProject.vcxproj Debug|x86. IntelliSense může být nedostupný.". | Tento problém s IntelliSense se vyřeší po prvním sestavení. |
| Při pokusu o zadání winrt::auto_revoke při registraci delegáta dojde k výjimce winrt::hresult_no_interface. | Pokud se delegátovi automatického zrušení nepodaří zaregistrovat, viz |
| V aplikaci C++/WinRT při využívání komponenty C# prostředí Windows Runtime, která používá XAML, kompilátor vytvoří chybu formuláře ""MyNamespace_XamlTypeInfo": není členem winrt::MyNamespace"– kde MyNamespace je název oboru názvů komponenty Windows Runtime. | V pch.h v aplikaci C++/WinRT přidejte #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>– podle potřeby nahraďte MyNamespace. |
| V projektu C++/WinRT v sadě Visual Studio vytvoří IntelliSense chybu formuláře "error E1696: cannot open source file" (Chyba E1696: nemůže otevřít zdrojový soubor). | Zkompilujte nově vytvořený projekt alespoň jednou. Potom klikněte pravým tlačítkem v editoru zdrojového kódu >znovu prohledat>Znovu prohledat soubor. Tím se vyřeší všechny chyby IntelliSense, včetně E1696. |
Poznámka:
Pokud toto téma neodpovídalo na vaši otázku, může vám pomoct navštívit komunitu vývojářů visual Studio C++nebo pomocí značky c++-winrt na webu Stack Overflow.