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.
Note
Informace o instalaci a používání rozšíření C++/WinRT Visual Studio (VSIX) (který poskytuje podporu šablon projektu) najdete v tématu Visual Studio podpora 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 portujete a chcete se rychle posunout dál do fáze, kdy se projekt sestaví a spustí, můžete dočasně pokročit tak, že zakomentujete nebo nahradíte zástupnou implementací veškerý nepodstatný kód, který způsobuje problémy, a k odstranění tohoto technického dluhu se vrátíte později.
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 vyvolání (abyste se pokusili zachytit výjimku při parsování hned na začátku). Možná budete moci v ladicím programu prozkoumat proměnnou výjimky a určit, zda HRESULT nebo zpráva obsahují nějaké užitečné informace. Zkontrolujte také okno Výstup v aplikaci Visual Studio, zda neobsahuje chybové zprávy generované analyzátorem XAML.
Pokud se vaše aplikace ukončí a vše, co víte, je, že během parsování značek XAML došlo k neošetřené výjimce, může to být důsledek odkazu (pomocí 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í. Ze stránky XAML odeberte asi polovinu značek a znovu spusťte aplikaci. Pak budete vědět, zda je chyba v té polovině, kterou jste odstranili (a kterou byste teď měli v každém případě obnovit), nebo v polovině, kterou jste neodstranili. Opakujte tento postup rozdělením té poloviny, která obsahuje chybu, a tak dále, dokud problém přesně neurčíte.
Příznaky a léky
| Symptom | Náprava |
|---|---|
| Za běhu se vyvolá výjimka s hodnotou HRESULT REGDB_E_CLASSNOTREGISTERED. | Podívejte se, proč se mi zobrazuje výjimka "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 make s nekvalifikovaným názvem oboru názvů vašeho implementačního typu (například MyRuntimeClass) a nezahrnuli jste hlavičkový soubor tohoto typu. Kompilátor interpretuje MyRuntimeClass jako projektovaný typ. Řešením je zahrnout hlavičku pro váš typ implementace (MyRuntimeClass.hnapříklad). |
| Kompilátor jazyka C++ způsobí chybu "pokus o odkaz na odstraněnou funkci". | K tomu může dojít, když zavoláte make a 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. Viz Ovládací prvky XAML; vazba na vlastnost C++/WinRT. |
| Vážete ovládací prvek položek XAML na pozorovatelnou kolekci a za běhu dojde k výjimce se zprávou „Parametr není správný“. | V IDL a vaší implementaci deklarujte všechny pozorovatelné kolekce jako typ Windows. Foundation.Collections.IVector<IInspectable>. Vraťte ale objekt, který implementuje Windows. Foundation.Collections.IObservableVector<T>, kde T je váš typ prvku. Prohlédněte si ovládací prvky položek XAML; vytvořte vazbu na kolekci C++/WinRT. |
| 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. Praktický příklad naleznete v části Odvození z typu, který má netriviální konstruktor. |
| Kompilátor C++ vytváří chybu "nelze převést z 'const std::vector<std::wstring,std::allocator<_Ty>>' na 'const winrt::param::async_iterable<winrt::hstring> &'". | To se může stát, když do rozhraní API prostředí Windows Runtime, které očekává kolekci, předáte std::vector typu std::wstring. Další informace najdete v tématu Standardní datové typy C++ a C++/WinRT. |
| Kompilátor C++ vygeneruje 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 objekt std::vector |
| Při otevření projektu Visual Studio zobrazí chybu "Aplikace pro projekt není nainstalována". | Pokud jste to ještě neudělali, musíte nainstalovat šablony Windows App SDK C++ a rozšíření Visual Studio C++/WinRT (VSIX) (viz Visual Studio podpora jazyka C++/WinRT). |
| Testy v sadě aplikace pro Windows Certification Kit vrátí chybu, že jedna z vašich tříd modulu runtime není odvozena od základní třídy Windows. Všechny kompozitní třídy musí být nakonec odvozeny od typu v oboru názvů Windows". | Každá třída modulu runtime (kterou deklarujete ve své aplikaci), která je odvozena ze základní třídy, se označuje jako kompozovatelná třída. Nejzazší základní třída kompozovatelné třídy musí být typem pocházejícím z oboru názvů Windows.* nebo Microsoft.*; například Microsoft.UI.Xaml.DependencyObject. Další podrobnosti najdete v tématu Ovládací prvky XAML; navázání na vlastnost C++/WinRT. |
| Kompilátor jazyka C++ hlásí chybu „T musí být typ WinRT“ pro specializaci delegáta EventHandler nebo TypedEventHandler. | Zvažte místo toho použití winrt::delegate<...T>. Viz Události vytváření v C++/WinRT. |
| Kompilátor C++ hlásí chybu „T musí být typu WinRT“ pro specializaci asynchronní operace prostředí prostředí Windows Runtime. | Zvažte místo toho vrácení úlohy knihovny PPL (Parallel Patterns Library). Viz Souběžnost a asynchronní operace. |
| Kompilátor jazyka C++ při volání winrt::xaml_typename vytvoří chybu typu T musí být typu WinRT. | 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). Viz 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é>Považovat upozornění za chyby na Ne (/WX-). |
| Vaše aplikace selže, protože obslužná rutina pro událost ve vašem objektu C++/WinRT je volána poté, co byl objekt zničen. | Podívejte se na bezpečný přístup k tomuto ukazateli pomocí delegáta zpracování událostí. |
| Kompilátor C++ vytvoří chybu C2338: Toto je pouze pro slabou podporu ref. | Požadujete slabou referenci na typ, který předal značkovou strukturu winrt::no_weak_ref jako argument šablony své základní třídě. Viz Vyjádření nesouhlasu se slabými referenčními podporami. |
| 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" nelze použít dříve, než je definována?. |
| Linker jazyka C++ vytvoří chybu LNK2019: Nevyřešený externí symbol. | Přečtěte si, proč linker zobrazuje 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++ pro promítaný typ vypíše chybu „není k dispozici žádný vhodný výchozí konstruktor“. | Pokud se pokoušíte odložit inicializaci objektu běhové třídy nebo využívat a implementovat běhovou třídu v rámci stejného projektu, budete muset zavolat konstruktor std::nullptr_t. Další informace najdete v tématu Využití rozhraní API s 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 Windows SDK verze 10.0.17134.0 (Windows 10 verze 1803). | Buď použijte novější (více vyhovující standardům) verzi sady Windows SDK, nebo nastavte vlastnost projektu C/C++>Language>Conformance mode: Ne (také pokud se /permissive- objevuje ve vlastnosti projektu C/C++>Language>Command Line v části Additional Options, odstraňte jej). |
| Kompilátor C++ vytvoří chybu C2039: IUnknown: není členem globálního oboru názvů. | Přečtěte si, jak změnit cílení projektu C++/WinRT na novější verzi Windows SDK. |
| Linker jazyka C++ vygeneruje „chybu LNK2019: nevyřešený externí symbol _WINRT_CanUnloadNow@0, na který odkazuje funkce _VSDesignerCanUnloadNow@0“ | Přečtěte si, jak změnit cílení projektu C++/WinRT na novější verzi Windows SDK. |
| Při sestavení se zobrazí chybová zpráva VSIX pro C++/WinRT už neposkytuje podporu pro sestavení projektu. Přidejte prosím referenci na balíček NuGet Microsoft.Windows.CppWinRT | Nainstalujte do svého projektu balíček NuGet Microsoft.Windows.CppWinRT. Podrobnosti najdete v předchozích verzích rozšíření VSIX. |
| Linker jazyka C++ vypíše chybu LNK2019: nevyřešený externí symbol se zmínkou o winrt::impl::consume_Windows_Foundation_Collections_IVector. | Od C++/WinRT 2.0 platí, že pokud používáte rozsah založený for na 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. | Viz Jak vyřešit nejednoznačnosti u funkce GetCurrentTime nebo TRY? |
| Kompilátor C++ vypíše „chyba C2334: neočekávané tokeny před znakem '{'; přeskakuje zjevné tělo funkce“. | Viz Jak vyřeším nejednoznačnosti s funkcí GetCurrentTime a/nebo TRY? |
| Kompilátor jazyka C++ vytvoří "winrt::impl::produce<D,I> nelze vytvořit instanci abstraktní třídy, protože chybí GetBindingConnector". | Potřebujete #include <winrt/Microsoft.UI.Xaml.Markup.h>. |
| Kompilátor C++ vygeneruje „chybu C2039: ‚promise_type‘: není členem typu ‚std::experimental::coroutine_traits<void>‘“. | Vaše korutina musí vracet buď objekt pro asynchronní operaci, nebo winrt::fire_and_forget. Viz Souběžnost a asynchronní operace. |
| Váš projekt generuje „nejednoznačný přístup k '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 se zobrazí zpráva „Sestavení v době návrhu se pro projekt 'MyProject.vcxproj' v konfiguraci 'Debug|x86' nezdařilo. IntelliSense nemusí být k dispozici.“. | Tento problém s IntelliSense se vyřeší po prvním sestavení. |
| Pokus o zadání parametru winrt::auto_revoke při registraci delegáta vyvolá výjimku winrt::hresult_no_interface. | Podívejte se, jestli se delegáta automatického odvolání nepodaří zaregistrovat. |
| V aplikaci C++/WinRT při využívání komponenty prostředí Windows Runtime jazyka C#, 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 prostředí Windows Runtime. | V aplikaci C++/WinRT, která tuto komponentu využívá, přidejte do pch.h prvek #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h> – podle potřeby nahraďte MyNamespace. |
| V projektu C++/WinRT v aplikaci Visual Studio IntelliSense zobrazí chybové hlášení ve tvaru "error E1696: cannot open source file". | Zkompilujte nově vytvořený projekt alespoň jednou. Potom klikněte pravým tlačítkem myši v editoru zdrojového kódu >Znovu prohledat>Znovu prohledat soubor. Tím se vyřeší všechny chyby IntelliSense, včetně E1696. |
Note
Pokud toto téma neodpovídalo na vaši otázku, může vám pomoct navštívit komunitu vývojářů jazyka C++ Visual Studio nebo pomocí c++-winrt značky ve službě Stack Overflow.
Příbuzná témata
Note
V procesu migrace z dokumentace upW do této části probíhá řada témat C++/WinRT. Až do dokončení migrace můžou odkazy v následujícím seznamu vést k části Dokumentace k UPW. Projekce jazyka C++/WinRT je stejná pro aplikace pro UPW i WinUI 3, takže obsah je použitelný v obou kontextech. Jakékoli vzory specifické pro UWP (například životní cyklus aplikace nebo rozhraní API v oboru názvů Windows.UI) jsou v těchto článcích výslovně uvedeny.
Windows developer