Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Uwaga / Notatka
Aby uzyskać informacje na temat instalowania i używania C++/WinRT Rozszerzenia programu Visual Studio (VSIX) (które zapewnia obsługę szablonów projektu), zobacz Obsługa programu Visual Studio dla języka C++/WinRT.
Ten temat jest na początku, abyś był od razu świadomy; nawet jeśli jeszcze tego nie potrzebujesz. Poniższa tabela rozwiązywania problemów z objawami i środkami zaradczymi może być przydatna niezależnie od tego, czy wycinasz nowy kod, czy przenosisz istniejącą aplikację. Jeśli przenosisz projekt i chcesz szybko przejść do etapu, w którym projekt się kompiluje i uruchamia, możesz zrobić tymczasowy postęp, komentując lub tworząc zamienniki dla wszelkiego nieistotnego kodu powodującego problemy, a następnie wrócić do jego poprawy później.
Aby uzyskać listę często zadawanych pytań, zobacz Często zadawane pytania.
Śledzenie problemów z XAML
Analizowanie wyjątków XAML może być trudne do diagnozy — szczególnie kiedy w wyjątku brakuje znaczących komunikatów o błędach. Upewnij się, że debuger jest skonfigurowany do przechwytywania wyjątków pierwszej szansy (aby spróbować złapać wyjątek analizy na wczesnym etapie). Możesz sprawdzić zmienną wyjątku w debugerze, aby określić, czy element HRESULT lub komunikat ma jakiekolwiek przydatne informacje. Sprawdź również okno danych wyjściowych programu Visual Studio pod kątem komunikatów o błędach wyjściowych przez analizator XAML.
Jeśli aplikacja zakończy działanie i wiesz, że podczas analizowania znaczników XAML został zgłoszony nieobsługiwany wyjątek, może to być wynikiem odwołania (według klucza) do brakującego zasobu. Może to być również wyjątek wyrzucany wewnątrz kontrolki typu UserControl, kontrolki niestandardowej lub panelu układu niestandardowego. Ostatecznym rozwiązaniem jest podział binarny. Usuń około połowę znaczników ze strony XAML i uruchom ponownie aplikację. Następnie będziesz wiedzieć, czy błąd znajduje się w połowie, którą usunąłeś (którą w każdym przypadku powinieneś teraz przywrócić), czy w połowie, której nie usunąłeś. Powtórz proces, dzieląc na pół tę część, która zawiera błąd, i tak dalej, aż dokładnie zidentyfikujesz problem.
Objawy i środki zaradcze
| Objaw | Lekarstwo |
|---|---|
| Wyjątek jest zgłaszany podczas uruchamiania z wartością HRESULT REGDB_E_CLASSNOTREGISTERED. | Zobacz Dlaczego otrzymuję wyjątek „klasa niezarejestrowana”?. |
| Kompilator języka C++ generuje błąd ""implements_type": nie jest elementem członkowskim żadnej bezpośredniej lub pośredniej klasy bazowej<typu>"". | Może się tak zdarzyć, gdy wywołasz z niepełną nazwą przestrzeni nazw typu implementacji (MyRuntimeClass, na przykład), a nie dołączyłeś nagłówka tego typu. Kompilator interpretuje klasę MyRuntimeClass jako typ przewidywany. Rozwiązaniem jest dołączenie nagłówka dla typu implementacji (MyRuntimeClass.hna przykład). |
| Kompilator języka C++ generuje błąd "próba odwołania się do usuniętej funkcji". | Może się tak zdarzyć, gdy wywołujesz oraz typ implementacji przekazywany jako parametr szablonu ma konstruktor domyślny = delete. Zmodyfikuj plik nagłówkowy typu implementacji i zmień wartość = delete na = default. Można również dodać konstruktor do IDL dla klasy środowiska uruchomieniowego. |
| Zaimplementowałeś INotifyPropertyChanged, ale twoje powiązania XAML nie są aktualizowane (a interfejs użytkownika nie subskrybuje PropertyChanged). | Pamiętaj, aby ustawić Mode=OneWay (lub TwoWay) na wyrażeniu powiązania w znacznikach XAML. Zobacz kontrolki XAML; powiązanie z właściwością C++/WinRT. |
| Wiążesz kontrolkę elementów XAML do obserwowalnej kolekcji, a podczas wykonywania zgłaszany jest wyjątek z komunikatem "Parametr jest niepoprawny". | W swoim IDL i implementacji zadeklaruj każdą obserwowalną kolekcję jako typ Windows.Foundation.Collections.IVector<IInspectable>. Jednak zwróć obiekt, który implementuje Windows.Foundation.Collections.IObservableVector<T>, gdzie typem elementu jest T. Zobacz kontrolki elementów XAML; wiązanie z kolekcją C++/WinRT. |
| Kompilator języka C++ generuje błąd formularza "'MyImplementationType_base<MyImplementationType>': brak odpowiedniego konstruktora domyślnego". | Może się tak zdarzyć, gdy pochodzisz z typu, który ma nietrywialny konstruktor. Konstruktor typu pochodnego musi przekazać parametry, których potrzebuje konstruktor typu podstawowego. Aby zapoznać się z przykładowym przykładem, zobacz Wyprowadzanie z typu, który ma nietrywialny konstruktor. |
| Kompilator języka C++ generuje błąd " |
Może się to zdarzyć, gdy przekazujesz std::vector typu std::wstring do interfejsu API środowiska uruchomieniowego Windows, który oczekuje kolekcji. Aby uzyskać więcej informacji, zobacz Standardowe typy danych C++ i C++/WinRT. |
| Kompilator języka C++ generuje błąd "nie można przekonwertować 'const std::vector<winrt::hstring,std::allocator<_Ty>>' na 'const winrt::param::async_iterable<winrt::hstring> &'". | Może się to zdarzyć, gdy przekażesz std::vector winrt::hstring do asynchronicznego interfejsu API środowiska uruchomieniowego systemu Windows, który oczekuje kolekcji, a ty ani nie skopiowałeś, ani nie przeniosłeś wektora do asynchronicznego odbiorcy. Aby uzyskać więcej informacji, zobacz Standardowe typy danych C++ i C++/WinRT. |
| Podczas otwierania projektu program Visual Studio generuje błąd "Aplikacja dla projektu nie jest zainstalowana". | Jeśli jeszcze tego nie zrobiono, musisz zainstalować narzędzia uniwersalne systemu Windows na potrzeby programowania w języku C++ z poziomu okna dialogowego Nowy projekt programu Visual Studio. Jeśli to nie rozwiąże problemu, projekt może zależeć od rozszerzenia C++/WinRT Visual Studio (VSIX) (zobacz Obsługa programu Visual Studio dla języka C++/WinRT. |
| Testy zestawu certyfikacji aplikacji systemu Windows generują błąd, że jedna z klas środowiska uruchomieniowego "nie pochodzi z klasy podstawowej systemu Windows. Wszystkie klasy komponowalne muszą ostatecznie pochodzić z typu w przestrzeni nazw systemu Windows. | Każda klasa środowiska uruchomieniowego (zadeklarowana w aplikacji) pochodząca z klasy bazowej jest nazywana klasą komponowalną. Ostateczna klasa bazowa klasy komponowalnej musi być typem pochodzącym z przestrzeni nazw systemu Windows.* na przykład Windows.UI.Xaml.DependencyObject. Zobacz kontrolki XAML; Aby uzyskać więcej informacji, utwórz powiązanie z właściwością C++/WinRT. |
| Kompilator języka C++ zgłasza błąd "T musi być typem WinRT" dla specjalizacji delegata EventHandler lub TypedEventHandler. | Rozważ użycie winrt::delegate<... Zamiast tego>. Zobacz zdarzenia tworzenia w języku C++/WinRT. |
| Kompilator języka C++ zwraca komunikat o błędzie "T musi być typem WinRT" dla specjalizacji operacji asynchronicznej środowiska uruchomieniowego Windows. | Rozważ zwrócenie zadania z biblioteki wzorców równoległych (PPL) |
| Kompilator języka C++ generuje błąd "T musi być typem WinRT" podczas wywoływania winrt::xaml_typename. | Użyj przewidywanego typu z winrt::xaml_typename (na przykład użyj BgLabelControlApp::BgLabelControl), a nie typu implementacji (na przykład nie używaj BgLabelControlApp::implementation::BgLabelControl). Zobacz kontrolki niestandardowe (szablony) XAML. |
| Kompilator języka C++ generuje "błąd C2220: ostrzeżenie traktowane jako błąd — nie wygenerowano pliku "object". | Popraw ostrzeżenie lub ustaw C/C++>Ogólne>Traktuj ostrzeżenia jako błędy na Nie (/WX-). |
| Aplikacja ulega awarii, ponieważ program obsługi zdarzeń w obiekcie C++/WinRT jest wywoływany po zniszczeniu obiektu. | Zobacz Bezpieczne uzyskiwanie dostępu do tego wskaźnika za pomocą delegata obsługi zdarzeń. |
| Kompilator języka C++ generuje błądC2338: Dotyczy to tylko słabej obsługi ref". | Żądasz słabego odwołania dla typu, który przekazał winrt::no_weak_ref strukturę znacznika jako argument szablonu do klasy bazowej. Zobacz Rezygnacja ze słabej obsługi referencyjnej. |
| Kompilator języka C++ generuje "consume_Something: funkcja, która zwraca 'auto', nie może być używana przed jej zdefiniowaniem" | Zobacz C3779: Dlaczego kompilator wyświetla błąd "consume_Something: funkcja zwracająca wartość 'auto' nie może być użyta przed zdefiniowaniem"?. |
| Linker języka C++ generuje błąd "LNK2019: nierozwiązany symbol zewnętrzny" | Zobacz Dlaczego linker daje mi błąd „LNK2019: Nierozwiązany symbol zewnętrzny.”. |
| Łańcuch narzędzi LLVM i Clang generuje błędy w przypadku użycia z językiem C++/WinRT. | Nie obsługujemy łańcucha narzędzi LLVM i Clang dla języka C++/WinRT, ale jeśli chcesz emulować sposób używania go wewnętrznie, możesz wypróbować eksperyment, taki jak opisany w temacie Czy mogę użyć języka LLVM/Clang do skompilowania za pomocą języka C++/WinRT?. |
| Kompilator języka C++ tworzy "nie ma odpowiedniego domyślnego konstruktora dostępnego" dla przewidywanego typu. | Jeśli próbujesz opóźnić inicjowanie obiektu klasy środowiska uruchomieniowego lub użyć i zaimplementować klasę środowiska uruchomieniowego w tym samym projekcie, należy wywołać konstruktor std::nullptr_t . Aby uzyskać więcej informacji, zobacz Korzystanie z interfejsów API za pomocą języka C++/WinRT. |
| Kompilator języka C++ generuje błąd C3861: "from_abi": nie znaleziono identyfikatora" i inne błędy pochodzące z pliku base.h. Błąd ten może wystąpić, jeśli używasz programu Visual Studio 2017 (w wersji 15.8.0 lub nowszej) i celujesz w wersję 10.0.17134.0 zestawu Windows SDK (Windows 10, wersja 1803). | Ustaw późniejszą (bardziej zgodną) wersję zestawu Windows SDK lub ustaw właściwość projektu C/C++>Language>Tryb zgodności: Nie (również jeśli /permissive- pojawia się we właściwości projektu C/C++>Language>Wiersz poleceń w Dodatkowe opcje, następnie usuń tę opcję). |
| Kompilator języka C++ generuje "błąd C2039: "IUnknown": nie jest członkiem "globalnej przestrzeni nazw". | Zobacz Jak przekierować swój projekt C++/WinRT na nowszą wersję Windows SDK. |
| Konsolidator języka C++ generuje błąd "LNK2019: nierozwiązany symbol zewnętrzny _WINRT_CanUnloadNow@0 przywoływany w funkcji _VSDesignerCanUnloadNow@0" | Zobacz Jak przekierować swój projekt C++/WinRT na nowszą wersję Windows SDK. |
| Proces kompilacji generuje komunikat o błędzie C++/WinRT VSIX nie zapewnia już obsługi kompilacji projektu. Dodaj odwołanie do projektu do pakietu Nuget Microsoft.Windows.CppWinRT. | Zainstaluj pakiet Microsoft.Windows.CppWinRT NuGet w projekcie. Aby uzyskać szczegółowe informacje, zobacz wcześniejsze wersje rozszerzenia VSIX. |
| Konsolidator języka C++ generuje błąd LNK2019: nierozwiązany symbol zewnętrzny, z wzmianką o winrt::impl::consume_Windows_Foundation_Collections_IVector. | Od wersji C++/WinRT 2.0, jeśli używasz for opartej na zakresie w kolekcji środowiska uruchomieniowego systemu Windows, musisz teraz #include <winrt/Windows.Foundation.Collections.h>. |
| Kompilator języka C++ generuje "błąd C4002: Zbyt wiele argumentów wywołania makra przypominającego funkcję GetCurrentTime". | Zobacz Jak rozwiązać niejednoznaczności za pomocą polecenia GetCurrentTime i/lub TRY?. |
| Kompilator języka C++ generuje "błąd C2334: nieoczekiwane tokeny poprzedzające "{"; pomijanie widocznej treści funkcji". | Zobacz Jak rozwiązać niejednoznaczności za pomocą polecenia GetCurrentTime i/lub TRY?. |
| Kompilator języka C++ generuje błąd "winrt::impl::produce<D,I> nie może utworzyć wystąpienia klasy abstrakcyjnej z powodu braku metody GetBindingConnector". | Musisz #include <winrt/Windows.UI.Xaml.Markup.h>. |
| Kompilator języka C++ generuje błądC2039: „promise_type”: nie jest członkiem „std::experimental::coroutine_traits<void>”. | Twoja korutyna musi zwrócić obiekt operacji asynchronicznej lub winrt::fire_and_forget. Zobacz współbieżność i operacje asynchroniczne. |
| Projekt generuje "niejednoznaczny dostęp do 'PopulatePropertyInfoOverride'". | Ten błąd może wystąpić, gdy deklarujesz jedną klasę bazową w języku IDL i inną klasę bazową w znaczniku XAML. |
| Ładowanie rozwiązania C++/WinRT po raz pierwszy powoduje niepowodzenie kompilacji "Designtime dla konfiguracji "MyProject.vcxproj" projektu "Debug|x86". Funkcja IntelliSense może być niedostępna.". | Ten problem z IntelliSense zostanie rozwiązany po pierwszym utworzeniu. |
| Próba określenia winrt::auto_revoke podczas rejestrowania delegata generuje wyjątek winrt::hresult_no_interface. | Zobacz , jeśli delegat do automatycznego odwoływania nie może zarejestrować. |
| W aplikacji C++/WinRT podczas korzystania ze składnika środowiska uruchomieniowego systemu Windows C#, który używa języka XAML, kompilator generuje błąd formularza ""MyNamespace_XamlTypeInfo": nie jest członkiem "winrt::MyNamespace""— gdzie MyNamespace jest nazwą przestrzeni nazw składnika środowiska uruchomieniowego systemu Windows. | W pch.h w zużywającej aplikacji C++/WinRT dodaj #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>— zastępując MyNamespace odpowiednio. |
| W projekcie C++/WinRT w programie Visual Studio funkcja IntelliSense generuje błąd w formie "błąd E1696: nie można otworzyć pliku źródłowego". | Skompiluj nowo utworzony projekt co najmniej raz. Następnie kliknij prawym przyciskiem myszy w edytorze kodu źródłowego, >Przeskanuj ponownie>Przeskanuj ponownie plik. Spowoduje to rozwiązanie wszystkich błędów funkcji IntelliSense, w tym E1696. |
Uwaga / Notatka
Jeśli ten temat nie odpowiedział na twoje pytanie, możesz znaleźć pomoc, odwiedzając społeczność deweloperów programu Visual Studio C++lub używając tagu c++-winrt w witrynie Stack Overflow.