Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Note
Para informações sobre a instalação e utilização da Extensão Visual Studio (VSIX) C++/WinRT (que oferece suporte a modelos de projeto), veja o suporte ao Visual Studio para C++/WinRT.
Este tópico surge logo no início para que fiques desde logo a par dele, mesmo que ainda não precises disso. A tabela de sintomas e soluções de resolução de problemas abaixo pode ser útil para si, quer esteja a cortar novo código ou a portar uma aplicação existente. Se estiveres a portar e estiveres ansioso por avançar e chegar à fase em que o teu projeto se desenvolve e executa, podes fazer progressos temporarios comentando ou eliminando qualquer código não essencial que esteja a causar problemas, e depois voltar para pagar essa dívida mais tarde.
Para uma lista de perguntas frequentes, veja Perguntas frequentes.
Rastrear problemas com XAML
As exceções de análise XAML podem ser difíceis de diagnosticar — especialmente se não houver mensagens de erro significativas dentro da exceção. Certifique-se de que o depurador está configurado para intercetar exceções de primeira oportunidade (de modo a tentar intercetar a exceção de análise sintática logo no início). Pode ser possível inspecionar a variável exceção no depurador para determinar se o HRESULT ou a mensagem tem alguma informação útil. Além disso, verifique a janela de saída do Visual Studio para mensagens de erro geradas pelo parser XAML.
Se a tua aplicação encerrar inesperadamente e tudo o que souberes é que foi lançada uma exceção não tratada durante a análise da marcação XAML, isso pode resultar de uma referência (por chave) a um recurso inexistente. Ou pode ser uma exceção inserida num UserControl, um controlo personalizado ou um painel de layout personalizado. Um último recurso é uma divisão binária. Remove cerca de metade da marcação de uma página XAML e volta a correr a aplicação. Assim saberás se o erro está algures dentro da metade que removeste (que agora deves restaurar de qualquer forma) ou na metade que não removeste. Repita o processo dividindo a metade que contém o erro, e assim sucessivamente, até ter localizado o problema.
Sintomas e remédios
| Symptom | Ressarcimento |
|---|---|
| É gerada uma exceção em tempo de execução com o valor HRESULT REGDB_E_CLASSNOTREGISTERED. | Veja Porque estou a receber uma exceção de "classe não registada"? |
| O compilador C++ produz o erro "'implements_type': não é membro de nenhuma classe base direta ou indireta de '<tipo> projetado'". | Isto pode acontecer quando chama make com o nome não qualificado do seu tipo de implementação (MyRuntimeClass, por exemplo), e não incluiu o cabeçalho desse tipo. O compilador interpreta MyRuntimeClass como o tipo projetado. A solução é incluir o cabeçalho para o seu tipo de implementação (MyRuntimeClass.h, por exemplo). |
| O compilador C++ produz o erro "ao tentar referenciar uma função eliminada". | Isto pode acontecer quando chamas make e o tipo de implementação que passas como parâmetro template tem um = delete construtor padrão. Edite o ficheiro de cabeçalho do tipo de implementação e mude = delete para = default. Também podes adicionar um construtor ao IDL para a classe de runtime. |
| Implementou INotifyPropertyChanged, mas as suas associações XAML não estão a ser atualizadas (e a IU não está a subscrever o evento PropertyChanged). | Lembre-se de definir Mode=OneWay (ou TwoWay) na sua expressão de associação na marcação XAML. Ver controlos XAML; vincular a uma propriedade C++/WinRT. |
| Estás a associar um controlo de itens XAML a uma coleção observável, e uma exceção é lançada em tempo de execução com a mensagem "O parâmetro está incorreto". | No seu IDL e na sua implementação, declare qualquer coleção observável como sendo do tipo Windows.Foundation.Collections.IVector<IInspectable>. Mas devolva um objeto que implemente Windows.Foundation.Collections.IObservableVector<T>, em que T é o seu tipo de elemento. Consulte controlos de itens em XAML; associar a uma coleção C++/WinRT. |
| O compilador C++ gera um erro do tipo "'MyImplementationType_base<MyImplementationType>': não existe nenhum construtor predefinido adequado disponível". | Isto pode acontecer quando se deriva de um tipo que tem um construtor não trivial. O construtor do tipo derivado precisa de transmitir os parâmetros que o construtor do tipo base necessita. Para um exemplo resolvido, veja Derivar a partir de um tipo que tem um construtor não trivial. |
| O compilador C++ produz o erro "não pode converter de 'const std::vector<std::wstring,std::allocator<_Ty>>' para 'const winrt::param::async_iterable<winrt::hstring> &'". | Isto pode acontecer quando se passa um std::vector de std::wstring para uma API do Windows Runtime que espera uma coleção. Para mais informações, veja Tipos de dados padrão em C++ e C++/WinRT. |
| O compilador C++ gera o erro "não é possível converter de 'const std::vector<winrt::hstring,std::allocator<_Ty>>' para 'const winrt::param::async_iterable<winrt::hstring> &'". | Isto pode acontecer quando passa um vetor std::de winrt::hstring para uma API de Windows Runtime assíncrona que espera uma coleção, e não copiou nem moveu o vetor para o chamado assíncrono. Para mais informações, veja Tipos de dados padrão em C++ e C++/WinRT. |
| Ao abrir um projeto, o Visual Studio produz o erro "A aplicação do projeto não está instalada". | Se ainda não o fizeste, precisas de instalar os templates do Windows App SDK em C++ e a extensão Visual Studio (VSIX) para C++/WinRT (ver suporte ao Visual Studio para C++/WinRT). |
| Os testes do Aplicação do Windows Certification Kit produzem um erro de que uma das suas classes de runtime "não deriva de uma classe base do Windows. Todas as classes componíveis devem, em última análise, derivar de um tipo no namespace Windows". | Qualquer classe em tempo de execução (que declare na sua aplicação) que derive de uma classe base é conhecida como classe composável . A classe base final de uma classe componível deve ser um tipo originário de um espaço de nomes Windows.* ou Microsoft.*; por exemplo, Microsoft. UI. Xaml.DependencyObject. Veja controlos XAML; associe a uma propriedade C++/WinRT para mais detalhes. |
| O compilador C++ produz um erro "T deve ser do tipo WinRT" para uma especialização de delegado EventHandler ou TypedEventHandler. | Considere utilizar winrt::delegate<...T> em vez disso. Ver eventos de autor em C++/WinRT. |
| O compilador C++ produz um erro "T deve ser do tipo WinRT" para uma especialização de operação assíncrona em Windows Runtime. | Considere retornar uma tarefa da Parallel Patterns Library (PPL) em alternativa. Ver Concorrência e operações assíncronas. |
| O compilador C++ produz um erro "T deve ser do tipo WinRT" quando chama winrt::xaml_typename. | Utilize o tipo projetado com winrt::xaml_typename (por exemplo, utilize BgLabelControlApp::BgLabelControl) e não o tipo de implementação (por exemplo, não utilize BgLabelControlApp::implementation::BgLabelControl). Veja controlos XAML personalizados com modelo. |
| O compilador C++ produz "erro C2220: aviso tratado como erro - nenhum ficheiro 'objeto' gerado". | Corrija o aviso ou defina C/C++>Geral>Tratar avisos como erros como Não (/WX-). |
| A tua aplicação crasha porque um gestor de eventos no teu objeto C++/WinRT é chamado depois de o objeto ter sido destruído. | Consulte o acesso seguro ao ponteiro this com um delegado de processamento de eventos. |
| O compilador C++ produz "erro C2338: Isto é apenas para suporte fraco de referência". | Estás a pedir uma referência fraca para um tipo que passou a estrutura de marcadores winrt::no_weak_ref como argumento modelo para a sua classe base. Veja Desativar o suporte para referências fracas. |
| O compilador C++ produz "consume_Something: função que devolve 'auto' não pode ser usada antes de ser definida" | Veja C3779: Porque é que o compilador me está a dar um erro "consume_Something: função que devolve 'auto' não pode ser usada antes de ser definida"? |
| O linker C++ produz "erro LNK2019: Símbolo externo não resolvido" | Veja Porque é que o linker me está a dar um erro "LNK2019: Símbolo externo não resolvido"? |
| A cadeia de ferramentas LLVM e Clang produz erros quando usada com C++/WinRT. | Não suportamos a cadeia de ferramentas LLVM e Clang para C++/WinRT, mas se quiser emular como a usamos internamente, pode tentar um experimento como o descrito em Posso usar LLVM/Clang para compilar com C++/WinRT?. |
| O compilador C++ produz "nenhum construtor padrão apropriado disponível" para um tipo projetado. | Se estiveres a tentar atrasar a inicialização de um objeto de classe de runtime, ou consumir e implementar uma classe de runtime no mesmo projeto, então terás de chamar o construtor std::nullptr_t . Para mais informações, consulte Consume APIs com C++/WinRT. |
| O compilador C++ produz "erro C3861: 'from_abi': identificador não encontrado" e outros erros originados no base.h. Pode encontrar este erro se estiver a usar o Visual Studio 2017 (versão 15.8.0 ou posterior) e a direcionar o SDK do Windows versão 10.0.17134.0 (Windows 10, versão 1803). | Direcione uma versão posterior (mais conforme) do SDK do Windows ou defina a propriedade do projeto C/C++>Linguagem>Modo de conformidade: Não (também, se /permissive- aparecer na propriedade do projeto C/C++>Linguagem>Linha de Comandos em Opções Adicionais, elimine-o). |
| O compilador C++ produz "erro C2039: 'IUnknown': não é membro de ''espaço de nomes global''". | Veja Como redirecionar o seu projeto C++/WinRT para uma versão posterior do SDK do Windows. |
| O linker C++ produz "erro LNK2019: símbolo externo não resolvido _WINRT_CanUnloadNow@0 referenciado na função _VSDesignerCanUnloadNow@0" | Veja Como redirecionar o seu projeto C++/WinRT para uma versão posterior do SDK do Windows. |
| O processo de compilação produz a mensagem de erro O C++/WinRT VSIX já não fornece suporte para compilação de projetos. Por favor, adicione uma referência de projeto ao Microsoft.Windows. Pacote CppWinRT Nuget. | Instale o pacote NuGet Microsoft.Windows.CppWinRT no seu projeto. Para detalhes, veja Versões anteriores da extensão VSIX. |
| O linker de C++ produz erro LNK2019: símbolo externo não resolvido, com referência a winrt::impl::consume_Windows_Foundation_Collections_IVector. | A partir de C++/WinRT 2.0, se estiver a usar um for baseado em intervalo numa coleção do Windows Runtime, passará a ter de #include <winrt/Windows.Foundation.Collections.h>. |
| O compilador C++ produz "erro C4002: Demasiados argumentos para invocação de macro semelhante a uma função GetCurrentTime". | Veja Como resolvo ambiguidades com o GetCurrentTime e/ou TRY?. |
| O compilador C++ produz "erro C2334: token(s) inesperado(s) antecedendo '{'; saltando o corpo de função aparente". | Veja Como resolvo ambiguidades com o GetCurrentTime e/ou TRY?. |
| O compilador C++ produz "winrt::impl::produce<D,I> cannot instantiate abstract class, devido à ausência de GetBindingConnector". | Tens de #include <winrt/Microsoft.UI.Xaml.Markup.h>fazer. |
| O compilador C++ produz "erro C2039: 'promise_type': não é membro de 'std::experimental::coroutine_traits<void>'". | A sua corrotina tem de devolver ou um objeto de operação assíncrona ou winrt::fire_and_forget. Ver Concorrência e operações assíncronas. |
| O seu projeto produz "acesso ambíguo a 'PopulatePropertyInfoOverride'". | Este erro pode ocorrer quando declaras uma classe base no teu IDL e outra classe base diferente na marcação XAML. |
| Ao carregar uma solução C++/WinRT pela primeira vez, é apresentada a mensagem "A compilação em tempo de estruturação falhou para o projeto 'MyProject.vcxproj' na configuração 'Debug|x86'. O IntelliSense poderá não estar disponível.". | Este problema com o IntelliSense será resolvido depois de montares pela primeira vez. |
| A tentativa de especificar winrt::auto_revoke ao registar um delegado gera a exceção winrt::hresult_no_interface. | Consulte Caso o delegado de autorrevogação não consiga registar-se. |
| Numa aplicação C++/WinRT, ao consumir um componente Windows Runtime C# que utiliza XAML, o compilador produz um erro da forma "'MyNamespace_XamlTypeInfo': não é membro de 'winrt::MyNamespace'"—onde MyNamespace é o nome do namespace do componente Windows Runtime. | Em pch.h, na aplicação C++/WinRT que a consome, adicione #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h> — substituindo MyNamespace consoante o caso. |
| Num projeto C++/WinRT no Visual Studio, o IntelliSense produz um erro do formato "erro E1696: cannot open source file". | Compila o teu projeto recém-criado pelo menos uma vez. Depois, clique com o botão direito no editor de código-fonte >Rescan>Rescan File. Isso resolverá todos os erros do IntelliSense, incluindo o E1696. |
Note
Se este tópico não respondeu à sua pergunta, pode encontrar ajuda visitando a comunidade de programadores C++ do Visual Studio, ou usando a c++-winrt tag no Stack Overflow.
Tópicos relacionados
Note
Muitos tópicos de C++/WinRT estão em processo de migração da documentação UWP para esta secção. Até a migração estar concluída, os links na lista abaixo podem conduzir à secção de documentação do UWP. A projeção da linguagem C++/WinRT é a mesma para aplicações UWP e WinUI 3, pelo que o conteúdo é aplicável em ambos os contextos. Quaisquer padrões específicos do UWP (como APIs do ciclo de vida da aplicação ou Windows.UI namespace) são explicitamente indicados nesses artigos.
Windows developer