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.
Note
Para obter informações sobre como instalar e usar a VSIX (Extensão de Visual Studio) do C++/WinRT (que fornece suporte ao modelo de projeto), consulte Visual Studio suporte para C++/WinRT.
Este tópico é apresentado logo no início para que você saiba disso desde o começo, mesmo que ainda não precise disso. A tabela abaixo de sintomas de problemas e soluções pode ser útil para você, tanto se estiver escrevendo um novo código quanto portando um aplicativo existente. Se você estiver fazendo a portabilidade e estiver ansioso para avançar e chegar ao estágio de compilação e execução do projeto, poderá fazer um progresso temporário comentando ou eliminando qualquer código não essencial que esteja causando problemas e retornando para resolver esse problema 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 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 na janela de saída do Visual Studio se há mensagens de erro de saída do analisador XAML.
Se o aplicativo for encerrado e tudo o que você sabe é que uma exceção sem tratamento foi lançada durante a análise da marcação XAML, isso pode ser resultado de uma referência (por chave) a um recurso ausente. Ou ela pode ser uma exceção lançada dentro de um UserControl, 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 | Solução |
|---|---|
| Uma exceção é lançada em runtime com um valor HRESULT de REGDB_E_CLASSNOTREGISTERED. | Veja Por que estou recebendo uma exceção 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 poderá acontecer quando você chamar make com o nome não qualificado de namespace do tipo de implementação (MyRuntimeClass, por exemplo) e não tiver incluído 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.hpor exemplo). |
| O compilador C++ produz o erro "tentando fazer referência a uma função excluída". | Isso pode acontecer quando você chama make 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 na IDL para a classe de tempo de execução. |
| Você implementou INotifyPropertyChanged, mas suas vinculaçõ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 vinculação no código XAML. Confira Controles XAML; associar 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". | Em sua IDL e na 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>, em que T é o tipo de elemento. Confira Controles de itens XAML; associar 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 poderá acontecer quando você fizer a derivação 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 precisa. Para obter um exemplo trabalhado, confira Como derivar de um tipo que tem um construtor não trivial. |
| O compilador C++ gera 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 poderá acontecer quando você passar um std::vector de std::wstring para uma API de Windows Runtime que espera uma coleção. Para obter mais informações, consulte tipos de dados C++ Padrão 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> &'". | Isso poderá acontecer quando você passar um std::vector de winrt::hstring para uma API assíncrona do Windows Runtime que espera uma coleção e não tiver copiado nem movido o vetor para o computador chamado assíncrono. Para obter mais informações, consulte tipos de dados C++ Padrão e C++/WinRT. |
| Ao abrir um projeto, Visual Studio produz o erro "O aplicativo para o projeto não está instalado". | Caso ainda não tenha feito isso, você precisará instalar os modelos C++ do SDK do Aplicativo Windows e a extensão do Visual Studio para C++/WinRT (VSIX) (consulte suporte do Visual Studio para C++/WinRT). |
| Os testes do Kit de Certificação aplicativo do Windows produzem um erro de que uma de suas classes de runtime "não deriva de uma classe base Windows. Todas as classes composáveis devem, em última análise, derivar de um tipo no namespace Windows". | Qualquer classe de runtime (que você declara em seu aplicativo) que deriva de uma classe base é conhecida como uma classe composable . A classe base final de uma classe composable deve ser um tipo originado em um namespace Windows.* ou Microsoft.* ; por exemplo, Microsoft. UI. Xaml.DependencyObject. Para obter mais detalhes, confira Controles XAML; associar a uma propriedade C++/WinRT. |
| O compilador C++ gera o erro "T precisa ser do tipo WinRT" para uma especialização de delegado de EventHandler ou TypedEventHandler. | Considere usar winrt::delegate<...T> em vez disso. Consulte como criar eventos em C++/WinRT. |
| O compilador C++ gera o erro "T precisa ser do tipo WinRT" para uma especialização de operação assíncrona do Windows Runtime. | Em vez disso, considere retornar uma tarefa PPL (Parallel Patterns Library). Consulte Concorrência e operações assíncronas. |
| O compilador C++ produz um erro "T deve ser 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). Consulte controles XAML personalizados com modelo. |
| O compilador C++ produz "erro C2220: aviso tratado como erro – nenhum arquivo 'objeto' gerado". | Corrija o aviso ou defina C/C++>Geral>Tratar avisos como erros para No (/WX-). |
| Seu aplicativo falha porque um manipulador de eventos em seu objeto C++/WinRT é chamado depois que o objeto é destruído. | Confira Acessar com segurança o ponteiro isso com um representante de manipulação de eventos. |
| O compilador C++ gera "erro C2338: Isto é apenas para suporte a referências fracas". | Você está solicitando uma referência fraca para um tipo que passou o struct de marcador winrt::no_weak_ref como um argumento de modelo para sua classe base. Consulte Desativar o suporte a referências fracas. |
| O compilador C++ produz "consume_Something: função que retorna 'auto' não pode ser usada 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 "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 Can I use 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 originários em base.h. Você poderá ver esse erro se estiver usando Visual Studio 2017 (versão 15.8.0 ou posterior) e direcionando o SDK Windows versão 10.0.17134.0 (Windows 10, versão 1803). | Use uma versão posterior (com maior conformidade) do SDK do Windows ou defina a propriedade do projeto C/C++>Language>Conformance mode: No (além disso, se /permissive- aparecer na propriedade do projeto C/C++>Language>Command Line, em Additional Options, exclua-o). |
| O compilador C++ produz "erro C2039: 'IUnknown': não é membro do ''namespace global''". | Veja como redirecionar seu projeto C++/WinRT para uma versão posterior do SDK do Windows. |
| O vinculador C++ gera "erro LNK2019: símbolo externo não resolvido _WINRT_CanUnloadNow@0 referenciado na função _VSDesignerCanUnloadNow@0" | Veja como redirecionar seu projeto C++/WinRT para uma versão posterior do SDK do Windows. |
| O processo de compilação produz a mensagem de erro O VSIX do C++/WinRT não oferece mais suporte à compilação do projeto. Adicione uma referência de projeto ao pacote NuGet Microsoft.Windows.CppWinRT. | Instale o pacote NuGet Microsoft.Windows.CppWinRT no seu projeto. Para obter detalhes, consulte versões anteriores da extensão VSIX. |
| O vinculador C++ produz um erro LNK2019: símbolo externo não resolvido, com uma menção de winrt::impl::consume_Windows_Foundation_Collections_IVector. | A partir do C++/WinRT 2.0, se você estiver usando um for baseado em intervalo na coleção de Windows Runtime e, em seguida, você precisará de #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 o "erro C2334: tokens inesperados antes de '{'; ignorando o corpo aparente da função". | Veja como resolver ambiguidades com GetCurrentTime e/ou TRY?. |
| O compilador C++ produz "winrt::impl::produce<D,I> não é possível instanciar a classe abstrata, devido à ausência de GetBindingConnector". | Você precisa #include <winrt/Microsoft.UI.Xaml.Markup.h>. |
| O compilador C++ produz "erro C2039: 'promise_type': não é membro de 'std::experimental::coroutine_traits<void>'". | Sua corrotina precisa retornar um objeto de operação assíncrona ou winrt::fire_and_forget. Consulte Concorrência e operações assíncronas. |
| Seu projeto gera "acesso ambíguo de '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 de C++/WinRT pela primeira vez produz "Falha no build no tempo de design para o projeto 'MyProject.vcxproj' com a configuração 'Debug|x86'. O IntelliSense pode estar indisponível.". | Esse problema do IntelliSense será resolvido após a primeira compilação. |
| A tentativa de especificar winrt::auto_revoke ao registrar um delegate gera a exceção winrt::hresult_no_interface. | Consulte Se o registro de seu delegado de revogação automática falhar. |
| Em um aplicativo C++/WinRT, ao consumir um componente de Windows Runtime C# que usa XAML, o compilador produz um erro do formulário "'MyNamespace_XamlTypeInfo': não é membro de 'winrt::MyNamespace'"— em que MyNamespace é o nome do namespace do componente Windows Runtime. | Em pch.h, no aplicativo C++/WinRT consumidor, adicione #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>—substituindo MyNamespace conforme apropriado. |
| Em um projeto C++/WinRT no Visual Studio, o IntelliSense gera um erro no formato "erro E1696: não é possível abrir o arquivo de origem". | Compile seu projeto recém-criado pelo menos uma vez. Em seguida, clique com o botão direito no editor de código-fonte >Rescan>Rescan File. Isso resolverá todos os erros do IntelliSense, incluindo e1696. |
Note
Se este tópico não respondeu à sua pergunta, talvez você encontre ajuda visitando a comunidade de desenvolvedores do Visual Studio C++ ou usando a c++-winrt marca no Stack Overflow.
Tópicos relacionados:
Note
Muitos tópicos do C++/WinRT estão em processo de migração da documentação da UWP para esta seção. Até que a migração seja concluída, os links na lista abaixo podem levar à seção de documentos UWP. A projeção de linguagem C++/WinRT é a mesma para aplicativos UWP e WinUI 3, de modo que o conteúdo seja aplicável em ambos os contextos. Quaisquer padrões específicos da UWP (como o ciclo de vida do aplicativo ou APIs do namespace Windows.UI) são explicitamente indicados nesses artigos.
Windows developer