Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Observação
Para obter informações sobre como instalar e usar o C++/WinRT VSIX (Extensão do Visual Studio) (que fornece suporte ao modelo de projeto) consulte suporte do Visual Studio paraC++/WinRT.
Este tópico está em destaque para que você saiba disso desde já, mesmo que ainda não precise. A tabela de solução de problemas e sintomas abaixo pode ser útil para quem estiver escrevendo um novo código ou portando um aplicativo existente. Se você estiver portando, e estiver ansioso para avançar e chegar ao estágio em que seu projeto é compilado e executado, então você pode fazer progressos temporários comentando ou descartando qualquer código não essencial que esteja causando problemas e, em seguida, voltando a pagar essa dívida mais tarde.
Para obter uma lista de perguntas frequentes, consulte perguntas frequentes.
Rastreando problemas de 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. Verifique se o depurador está configurado para capturar exceções de primeira chance (para tentar capturar a exceção de análise logo no início). Você pode inspecionar a variável de exceção no depurador para determinar se o HRESULT ou a mensagem tem informações úteis. Além disso, verifique a janela de saída do Visual Studio para mensagens de erro emitidas pelo analisador XAML.
Se o aplicativo for encerrado e tudo o que você sabe é que uma exceção sem tratamento foi gerada durante a análise de marcação XAML, isso pode ser o resultado de uma referência (por chave) a um recurso ausente. Ou pode ser uma exceção lançada dentro de um UserControl (controle do usuário), um controle personalizado ou um painel de layout personalizado. Um último recurso é uma divisão binária. Remova cerca de metade da marcação de uma Página XAML e execute novamente o aplicativo. Em seguida, você saberá se o erro está em algum lugar dentro da metade que você removeu (que agora você deve restaurar em qualquer caso) ou na metade que você não removeu. Repita o processo dividindo a metade que contém o erro e assim por diante, até que você tenha zerado o problema.
Sintomas e remédios
| Sintoma | Remédio |
|---|---|
| Uma exceção é gerada no runtime com um valor HRESULT de REGDB_E_CLASSNOTREGISTERED. | Veja Por que estou recebendo um erro de "classe não registrada"?. |
| O compilador C++ produz o erro "'implements_type': não é membro de nenhuma classe base direta ou indireta de '<tipo projetado>'". | Isso pode acontecer quando você chama fazer com o nome não qualificado do namespace do tipo de implementação (MyRuntimeClass, por exemplo), e você 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 tipo de implementação (MyRuntimeClass.h, por exemplo). |
| O compilador C++ produz o erro "tentando fazer referência a uma função excluída". | Isso pode acontecer quando você chama tornar e o tipo de implementação que você passa como o parâmetro de modelo tem um construtor padrão = delete. Edite o arquivo de cabeçalho do tipo de implementação e altere = delete para = default. Você também pode adicionar um construtor à IDL para a classe de tempo de execução. |
| Você implementou INotifyPropertyChanged, mas suas associações XAML não estão sendo atualizadas (e a interface do usuário não está se inscrevendo em PropertyChanged). | Lembre-se de definir Mode=OneWay (ou TwoWay) em sua expressão de associação na marcação XAML. Consulte controles XAML. Associe a uma propriedade C++/WinRT. |
| Você está associando um controle de itens XAML a uma coleção observável e uma exceção é lançada em runtime com a mensagem "O parâmetro está incorreto". | No seu IDL e na sua implementação, declare qualquer coleção observável como o tipo Windows.Foundation.Collections.IVector<IInspectable>. Mas retorne um objeto que implementa Windows.Foundation.Collections.IObservableVector<T>, onde T é o tipo de elemento. Consulte controles de itens XAML; associe a uma coleção C++/WinRT. |
| O compilador C++ produz um erro do formulário "'MyImplementationType_base<MyImplementationType>': nenhum construtor padrão apropriado disponível". | Isso pode acontecer quando você deriva de um tipo que tem um construtor não trivial. O construtor do tipo derivado precisa passar os parâmetros que o construtor do tipo base necessita. Para obter um exemplo trabalhado, consulte Derivando de um tipo que tem um construtor não trivial. |
| O compilador C++ produz o erro "não é possível converter de 'const std::vector<std::wstring,std::allocator<_Ty>>' para 'const winrt::param::async_iterable<winrt::hstring> &'". | Isso pode acontecer quando você passa um std::vector de std::wstring para uma API do Windows Runtime que requer uma coleção. Para obter mais informações, consulte Standard C++ tipos de dados e C++/WinRT. |
| O compilador C++ produz o erro "não é possível converter de 'const std::vector<winrt::hstring,std::allocator<_Ty>>' para 'const winrt::param::async_iterable<winrt::hstring> &'". | Isso pode acontecer quando você passa um std::vector de winrt::hstring para uma API assíncrona do Windows Runtime que espera uma coleção, e você não copiou nem moveu o vetor para o destinatário da chamada assíncrona. Para obter mais informações, consulte Standard C++ tipos de dados e C++/WinRT. |
| Ao abrir um projeto, o Visual Studio produz o erro "O aplicativo para o projeto não é instalado". | Caso ainda não tenha feito isso, você precisará instalar ferramentas Universais do Windows para de desenvolvimento do C++ na caixa de diálogo Novo Projeto do Visual Studio. Se isso não resolver o problema, então o projeto pode depender da Extensão do Visual Studio (VSIX) C++/WinRT (consulte suporte do Visual Studio para C++/WinRT). |
| Os testes do Kit de Certificação de Aplicativos do Windows produzem um erro de que uma de suas classes de runtime"não deriva de uma classe base do Windows. Todas as classes composáveis devem, em última análise, derivar de um tipo no namespace do Windows". | Qualquer classe de runtime (que você declara em seu aplicativo) que deriva de uma classe base é conhecida como uma classe composável. A classe base final de uma classe compositável deve ser um tipo originário em um namespace Windows.*; por exemplo, Windows.UI.Xaml.DependencyObject. Consulte os controles XAML e associe a uma propriedade C++/WinRT para obter mais detalhes. |
| O compilador C++ produz um erro "T deve ser do tipo WinRT" para uma especialização de delegado EventHandler ou TypedEventHandler. | Considere usar winrt::delegate <...T> em vez disso. Consulte os eventos do Author noC++/WinRT. |
| O compilador C++ produz um erro "T deve ser do tipo WinRT" para uma especialização de operações assíncronas do Windows Runtime. | Considere retornar uma tarefa do Parallel Patterns Library (PPL) em vez disso. Consulte operações de simultaneidade e assíncronas. |
| O compilador C++ produz um erro "T deve ser do tipo WinRT" quando você chama winrt::xaml_typename. | Use o tipo projetado com winrt::xaml_typename (por exemplo, use BgLabelControlApp::BgLabelControl), e não o tipo de implementação(por exemplo, não use BgLabelControlApp::implementation::BgLabelControl). Veja controles XAML personalizados (com modelos). |
| O compilador C++ produz "erro C2220: aviso tratado como erro – nenhum arquivo 'object' gerado". | Corrija o aviso ou defina C/C++>Geral>Tratar Avisos Como Erros para Não (/WX-). |
| Seu aplicativo falha porque um manipulador de eventos em seu objeto C++/WinRT é chamado depois que o objeto é destruído. | Consulte Acessando com segurança o este ponteiro de com um representante de manipulação de eventos. |
| O compilador C++ produz "Erro C2338: Isso é apenas para suporte de referência fraca". | Você está solicitando uma referência fraca para um tipo que passou a estrutura de marcador winrt::no_weak_ref como argumento de modelo para sua classe base. Consulte Desativar o suporte à referência fraca. |
| O compilador C++ gera "consume_Something: função que retorna 'auto' não pode ser utilizada antes de ser definida" | Consulte C3779: Por que o compilador está me dando um erro "consume_Something: função que retorna 'auto' não pode ser usada antes de ser definida"?. |
| O vinculador C++ produz "erro LNK2019: símbolo externo não resolvido" | Veja Por que o vinculador está me dando um erro de "LNK2019: símbolo externo não resolvido"?. |
| A cadeia de ferramentas LLVM e Clang produz erros quando usada com C++/WinRT. | Não damos suporte à cadeia de ferramentas LLVM e Clang para C++/WinRT, mas se você quiser emular como a usamos internamente, poderá experimentar 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 você estiver tentando atrasar a inicialização de um objeto de classe de runtime ou consumir e implementar uma classe de runtime no mesmo projeto, precisará chamar o construtor std::nullptr_t. Para obter mais informações, consulte Consumir APIs com C++/WinRT. |
| O compilador C++ produz "erro C3861: 'from_abi': identificador não encontrado", e outros erros originados em base.h. Você poderá ver esse erro se estiver usando o Visual Studio 2017 (versão 15.8.0 ou posterior) e direcionando o SDK do Windows versão 10.0.17134.0 (Windows 10, versão 1803). | Direcione uma versão posterior (mais compatível) do SDK do Windows ou defina a propriedade do projeto C/C++>Linguagens>Modo de conformidade: Não (também, se /permissive- aparecer na propriedade do projeto C/C++>Linguagem>Linha de Comando em Opções Adicionais, então exclua-o). |
| O compilador C++ produz "erro C2039: 'IUnknown': não é membro do ''namespace global''". | Consulte Como redirecionar seu projeto C++/WinRT para uma versão posterior dodo SDK do Windows. |
| O vinculador C++ produz "erro LNK2019: símbolo externo não resolvido _WINRT_CanUnloadNow@0 referenciado na função _VSDesignerCanUnloadNow@0" | Consulte Como redirecionar seu projeto C++/WinRT para uma versão posterior dodo SDK do Windows. |
| O processo de construção gera a mensagem de erro de que o VSIX do C++/WinRT não fornece mais suporte para construção do projeto. Por favor, adicione uma referência de projeto ao pacote NuGet Microsoft.Windows.CppWinRT. | Instale o pacote NuGet Microsoft.Windows.CppWinRT em seu projeto. Para obter detalhes, consulte Versões anteriores da extensão VSIX. |
| O vinculador C++ produz o erro LNK2019: símbolo externo não resolvido, com menção de winrt::impl::consume_Windows_Foundation_Collections_IVector. | A partir de C++/WinRT 2.0, se você estiver usando um for baseado em intervalo em uma coleção do Windows Runtime, agora precisará #include <winrt/Windows.Foundation.Collections.h>. |
| O compilador C++ produz "erro C4002: muitos argumentos para a invocação de macro semelhante à função GetCurrentTime". | Veja Como resolver ambiguidades com GetCurrentTime e/ou TRY?. |
| O compilador C++ produz "erro C2334: tokens inesperados anteriores a '{'; ignorando o corpo da função aparente". | Veja Como resolver ambiguidades com GetCurrentTime e/ou TRY?. |
| O compilador C++ produz "winrt::impl::produce<D,I> não pode instanciar a classe abstrata devido à ausência de GetBindingConnector". | Você precisa #include <winrt/Windows.UI.Xaml.Markup.h>. |
| O compilador C++ gera "erro C2039: 'promise_type': não é membro de 'std::experimental::coroutine_traits<void>'". | Sua coroutina precisa retornar um objeto de operação assíncrono ou winrt::fire_and_forget. Consulte operações de simultaneidade e assíncronas. |
| Seu projeto produz "acesso ambíguo ao 'PopulatePropertyInfoOverride'". | Esse erro pode ocorrer quando você declara uma classe base em sua IDL e uma classe base diferente em sua marcação XAML. |
| Carregar uma solução C++/WinRT pela primeira vez produz"falha na compilação do Designtime para a configuração 'MyProject.vcxproj' do projeto 'Depurar|x86'. O IntelliSense pode estar indisponível.". | Esse problema do IntelliSense será resolvido depois que você criar pela primeira vez. |
| A tentativa de especificar winrt::auto_revoke ao registrar um delegado produz uma exceção winrt::hresult_no_interface. | Consulte se o representante de revogação automática falhar em registrar. |
| Em um aplicativo C++/WinRT, ao consumir um componente do Windows Runtime C# que usa XAML, o compilador produz um erro do formulário "'MyNamespace_XamlTypeInfo': não é membro de 'winrt::MyNamespace'"— onde MyNamespace é o nome do namespace do componente do Windows Runtime. | Em |
| Em um projeto C++/WinRT no Visual Studio, o IntelliSense produz um erro do formulário "erro E1696: não é possível abrir o arquivo de código-fonte". | Compile seu projeto recém-criado pelo menos uma vez. Em seguida, clique com o botão direito do mouse no editor de código-fonte >Rescan>Rescan Arquivo. Isso resolverá todos os erros do IntelliSense, incluindo e1696. |
Observação
Se este tópico não respondeu à sua pergunta, talvez você encontre ajuda visitando o da comunidade de desenvolvedores do Visual Studio C++ ou usando a marca c++-winrt no Stack Overflow.