Aracılığıyla paylaş


C++/WinRT sorunlarını giderme

Uyarı

C++/WinRT Visual Studio Uzantısı (VSIX) (proje şablonu desteği sağlayan) yükleme ve kullanma hakkında bilgi için bkz. C++/WinRTiçin Visual Studio desteği .

Bu konu hemen farkında olmanız için ön taraftadır; henüz ihtiyacınız olmasa bile. Aşağıdaki sorun giderme belirtileri ve çözümleri tablosu, yeni kod kesme veya mevcut bir uygulamayı taşıma konusunda size yardımcı olabilir. Taşıma yapıyorsanız ve projenizin derlenip çalıştırıldığı aşamaya hızlıca geçmek istiyorsanız, sorunlara neden olan olmazsa olmaz olmayan kodları yoruma alarak veya geçici bir çözüm uygulayarak geçici bir ilerleme sağlayabilir, ardından bu açığı kapatmak için daha sonra geri dönebilirsiniz.

Sık sorulan soruların listesi için bkz. Sık sorulan sorular.

XAML sorunlarını izleme

XAML ayrıştırma özel durumlarını tanılamak zor olabilir; özellikle de özel durum içinde anlamlı hata iletileri yoksa. Hata ayıklayıcının ilk fırsat istisnalarını yakalayacak şekilde ayarlandığından emin olun (ayrıştırma istisnasını erken yakalamak için). HRESULT veya iletinin yararlı bilgileri olup olmadığını belirlemek için hata ayıklayıcıda özel durum değişkenini inceleyebilirsiniz. Ayrıca, XAML ayrıştırıcısı tarafından hata iletileri çıkışı için Visual Studio'nun çıkış penceresine bakın.

Uygulamanız sonlandırılırsa ve tek bildiğiniz XAML işaretleme ayrıştırma sırasında işlenmeyen bir özel durum oluştuğudur; bu, eksik bir kaynağa yapılan başvurunun (anahtara göre) sonucu olabilir. Ya da bir UserControl, özel kontrol veya özel bir düzen paneli içinde oluşan bir istisna olabilir. Son çare ikili bölmedir. XAML Sayfasından işaretlemenin yaklaşık yarısını kaldırın ve uygulamayı yeniden çalıştırın. Ardından, hatanın kaldırdığınız yarıda mı (her durumda geri yüklemeniz gerekir) yoksa kaldırmadığınız yarıda mı olduğunu bilirsiniz. Hatanın bulunduğu yarıyı bölmeye devam ederek işlemi tekrarlayın, hatayı belirleyene kadar.

Belirtiler ve çözümler

Semptom Çare
REGDB_E_CLASSNOTREGISTERED HRESULT değeriyle çalışma zamanında bir özel durum oluşturulur. Bkz. Neden "sınıf kayıtlı değil" özel durumu alıyorum?.
C++ derleyicisi şu hatayı veriyor: "'implements_type': '<öngörülen türü>doğrudan veya dolaylı temel sınıflarından hiçbirinin üyesi değil". Uygulama türünüzün ad alanına göre nitelendirilmemiş adıyla (MyRuntimeClass, örneğin) çağırdığınızda ve bu türün üst bilgisini dahil etmediğinizde bu durum gerçekleşebilir. Derleyici, MyRuntimeClass öngörülen tür olarak yorumlar. Çözüm, uygulama türünüzün (örneğin,MyRuntimeClass.h) üst bilgisini eklemektir.
C++ derleyicisi "silinmiş bir işleve başvurmaya çalışırken" hatasını üretiyor. Bu durum, çağırdığınızda ve şablon parametresi olarak varsayılan bir oluşturucuya sahip bir uygulama türü = delete ilettiğinizde oluşabilir. Uygulama türünün üst bilgi dosyasını düzenleyin ve = delete= defaultolarak değiştirin. Çalışma zamanı sınıfı için IDL'ye bir oluşturucu da ekleyebilirsiniz.
INotifyPropertyChangeduyguladınız, ancak XAML bağlamalarınız güncellenmiyor ve kullanıcı arabirimi PropertyChangedabone olmuyor. XAML işaretlemesinde bağlama ifadenizde Mode=OneWay (veya TwoWay) ayarlamayı unutmayın. Bkz. XAML denetimleri; C++/WinRT özelliğine bağla.
Bir XAML öğeleri denetimini gözlemlenebilir bir koleksiyona bağlıyorsunuz ve çalışma zamanında "Parametre doğru değil" iletisiyle bir istisna oluşturuluyor. IDL'nizde ve uygulamanızda, gözlemlenebilir koleksiyonları Windows.Foundation.Collections.IVectorIInspectabletürü olarak bildirin. Ancak, Windows.Foundation.Collections.IObservableVector<T>uygulayan bir nesne döndürür; burada T, öğe türünüzdür. Bkz. XAML öğeleri denetimleri;bir C++/WinRT koleksiyonuna bağlama.
C++ derleyicisi "'MyImplementationType_base<MyImplementationType>': uygun bir varsayılan oluşturucu mevcut değil" biçiminde bir hata üretir. Önemsiz olmayan bir oluşturucuya sahip bir tür türetdiğinizde bu durum oluşabilir. Türetilmiş türünüzün yapıcısının, temel türün yapıcısının ihtiyaç duyduğu parametreleri geçirmesi gerekir. Çalışılmış bir örnek için bkz. Karmaşık bir oluşturucuya sahip bir tipten türetme.
C++ derleyicisi "'const std::vector<std::wstring,std::allocator<_Ty>>' yerine 'const winrt::p aram::async_iterable<winrt::hstring> &'" hatası üretir. Bu durum, std::wstring'in std::vector değerini koleksiyon bekleyen bir Windows Çalışma Zamanı API'sine geçirdiğinizde oluşabilir. Daha fazla bilgi için bkz. standart C++ veri türlerini ve C++/WinRT.
C++ derleyicisi "'const std::vector<winrt::hstring,std::allocator<_Ty>>' yerine 'const winrt::p aram::async_iterable<winrt::hstring> &'" hatası üretir. Bu durum, winrt::hstring içeren bir std::vector'u koleksiyon bekleyen bir eşzamanlı Windows Çalışma Zamanı API'sine geçirdiğinizde ve vektörü eşzamanlı çağrıya ne kopyaladığınız ne de taşıdığınız durumlarda oluşabilir. Daha fazla bilgi için bkz. standart C++ veri türlerini ve C++/WinRT.
Bir projeyi açarken, Visual Studio "Proje için uygulama "yüklenmedi" hatasını üretir. Henüz yüklemediyseniz, Visual Studio'nun Yeni Proje iletişim kutusundan C++ geliştirme için Windows Evrensel araçları yüklemeniz gerekir. Bu sorun çözülmezse, proje C++/WinRT Visual Studio Uzantısına (VSIX) bağlı olabilir (bkz. C++/WinRTiçin Visual Studio desteği .
Windows Uygulama Sertifikasyon Seti testleri, çalışma zamanı sınıflarınızdan birinin "bir Windows temel sınıfından türetilmediği bir hata oluşturur. Tüm birleştirilebilir sınıfların "Windows ad alanı içindeki bir türden türemiş olması gerekir. Temel sınıftan türetilen herhangi bir çalışma zamanı sınıfı (uygulamanızda bildirdiğiniz) birleştirilebilir sınıfı olarak bilinir. Birleştirilebilir sınıfın nihai temel sınıfı, Windows.* ad alanından kaynaklanan bir tür olmalıdır; örneğin, Windows.UI.Xaml.DependencyObject. Daha fazla ayrıntı için C++/WinRT özelliğine bağlanan XAML denetimlerine bakın.
C++ derleyicisi bir EventHandler veya TypedEventHandler temsilci özelleştirmesi için "T, WinRT türü olmalıdır" hatası üretir. winrt::delegate<kullanmayı göz önünde bulundurun... T>. Bkz. C++/WinRTYazar olayları.
C++ derleyicisi, Windows Çalışma Zamanı zaman uyumsuz işlem özelleştirmesi için "T WinRT tipi olmalıdır" hatasını verir. Bunun yerine, Parallel Patterns Library (PPL) görevi geri döndürmeyi göz önünde bulundurun. Bkz. Eşzamanlılık ve zaman uyumsuz işlemler.
C++ derleyicisi, winrt::xaml_typenameçağırdığınızda "T WinRT türü" hatası verir. Öngörülen türü winrt::xaml_typename ile kullanın (örneğin, BgLabelControlApp::BgLabelControlkullanın), uygulama türünü kullanmayın (örneğin, BgLabelControlApp::implementation::BgLabelControlkullanmayın). XAML özel (şablonlu) denetimlerine bakın.
C++ derleyicisi "hata C2220: uyarı hata olarak değerlendirildi - 'object' dosyası oluşturulmadı". Uyarıyı düzeltin veya C/C++ >Genel>Uyarıları Hata Olarak DeğerlendirHayır (/WX-)olarak ayarlayın.
C++/WinRT nesnenizdeki bir olay işleyicisi nesne yok edildikten sonra çağrıldığından uygulamanız kilitleniyor. Bkz. Olay işleyici temsilcisiile bu işaretçisine güvenli erişim.
C++ derleyicisi, "hatası C2338: Bu sadece zayıf referans desteği içindir" hatasını üretir. winrt::no_weak_ref işaretleyici yapısını temel sınıfına şablon bağımsız değişkeni olarak geçmiş bir tür için zayıf referans istiyorsunuz. Bkz. Zayıf referans desteğinden çıkma.
C++ derleyicisi "consume_Something: 'auto' döndüren işlevtanımlanmadan önce kullanılamaz" Bkz. C3779: Derleyici neden bana "consume_Something: 'auto' döndüren işlev tanımlanmadan önce kullanılamaz" hatası veriyor?.
C++ bağlayıcısı "hata LNK2019: Çözümlenmemiş dış simge" oluşturur Bkz. Bağlayıcı neden bana "LNK2019: Çözülmemiş dış simge" hatası veriyor?.
LLVM ve Clang araç zinciri, C++/WinRT ile kullanıldığında hatalar üretir. C++/WinRT için LLVM ve Clang araç zincirini desteklemiyoruz, ancak bunu dahili olarak nasıl kullandığımıza öykünmek istiyorsanız, C++/WinRT ile derlemek için LLVM/Clang kullanabilir miyim? bölümünde açıklanan gibi bir deneme deneyebilirsiniz..
C++ derleyicisi, yansıtılan bir tür için "uygun varsayılan oluşturucu yok" hatasını üretir. Çalışma zamanı sınıfı nesnesinin başlatılmasını geciktirmeye veya aynı projede bir çalışma zamanı sınıfını kullanmak ve uygulamak istiyorsanız, std::nullptr_t oluşturucuyu çağırmanız gerekir. Daha fazla bilgi için C++/WinRT ile API'leri kullanmabölümüne bakın.
C++ derleyicisi "hatası C3861: 'from_abi': tanımlayıcıbulunamadı" ve base.hdosyasından kaynaklanan diğer hatalara neden olur. Visual Studio 2017 (sürüm 15.8.0 veya üzeri) kullanıyorsanız ve Windows SDK sürüm 10.0.17134.0'ı (Windows 10, sürüm 1803) hedef alıyorsanız bu hatayı görebilirsiniz. Windows SDK'sının daha sonraki (daha uyumlu) bir sürümünü hedefleyin veya C/C++DilUyumluluk modu proje özelliğini ayarlayın: C/C++DilKomut Satırı Ek Seçenekleraltında proje özelliğinde (ayrıca /permissive- görünür) yoktur. ardından silin).
C++ derleyicisi "hatası C2039: 'IUnknown': "'''global namespace'' üyesi değil. Bkz. C++/WinRT projenizi Windows SDK'nin daha yeni bir sürümüne nasıl yeniden hedefleyeceğiniz.
C++ bağlayıcısı "hata LNK2019 oluşturur: çözümlenmemiş dış simge _WINRT_CanUnloadNow@0 işlev _VSDesignerCanUnloadNow@0" Bkz. C++/WinRT projenizi Windows SDK'nin daha yeni bir sürümüne nasıl yeniden hedefleyeceğiniz.
Derleme işlemi hata iletisini oluşturur C++/WinRT VSIX artık proje derleme desteği sağlamaz. LütfenMicrosoft.Windows.CppWinRT Nuget paketine bir proje başvurusu ekleyin. Microsoft.Windows.CppWinRT NuGet paketini projenize yükleyin. Ayrıntılar için bkz. VSIX uzantısının önceki sürümleri.
C++ bağlayıcısı, çözümlenmemiş dış simgeile winrt::impl::consume_Windows_Foundation_Collections_IVectorhatasını içeren LNK2019 hatasını üretir. C++/WinRT 2.0itibarıyla, eğer Windows Çalışma Zamanı koleksiyonunda aralık tabanlı bir for kullanıyorsanız, artık #include <winrt/Windows.Foundation.Collections.h>yapmanız gerekir.
C++ derleyicisi "hatası C4002: GetCurrentTime" işlev benzeri makro çağırması için çok fazla bağımsız değişken üretir. Bkz. GetCurrentTime ve/veya TRY ile belirsizlikleri nasıl çözebilirim?.
C++ derleyicisi "hatası C2334: '{' öncesinde beklenmeyen belirteçler var; muhtemel işlev gövdesi atlanıyor." Bkz. GetCurrentTime ve/veya TRY ile belirsizlikleri nasıl çözebilirim?.
C++ derleyicisi "winrt::impl::produce<D,I>, eksik GetBindingConnectornedeniyle soyut sınıfın örneğini oluşturamıyor." #include <winrt/Windows.UI.Xaml.Markup.h>yapman gerekiyor.
C++ derleyicisi "hata C2039: 'promise_type', 'std::experimental::coroutine_traits<void>'' üyesi değil." mesajını üretir. Eş yordamınızın zaman uyumsuz bir işlem nesnesi veya winrt::fire_and_forgetdöndürmesi gerekir. Bkz. Eşzamanlılık ve zaman uyumsuz işlemler.
Projeniz, "'PopulatePropertyInfoOverride' isimli özelliğe belirsiz erişimin üretilmesine neden olur". IdL'nizde bir temel sınıf ve XAML işaretlemenizde farklı bir temel sınıf bildirdiğinizde bu hata oluşabilir.
C++/WinRT çözümü ilk kez yüklenirken "Tasarım zamanı derlemesi 'MyProject.vcxproj' projesinin 'Debug|x86' yapılandırması için başarısız oldu. IntelliSense kullanılamıyor olabilir.". Bu IntelliSense sorunu, ilk kez derleme işlemi yapıldıktan sonra çözülür.
Temsilci kaydederken winrt::auto_revoke belirtilmeye çalışıldığında bir winrt::hresult_no_interface özel durumu oluşturulur. Bkz. Otomatik iptal temsilcinizkaydedemezse.
C++/WinRT uygulamasında, XAML kullanan bir C# Windows Runtime bileşeni kullanıldığında, derleyici "'MyNamespace_XamlTypeInfo': 'winrt::MyNamespace'üyesi değildir." şeklinde bir hata üretir—burada MyNamespace, Windows Runtime bileşeninin ad alanının ismidir. C++/WinRT kullanan uygulamada, pch.h'da #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>'i ekleyin ve uygun şekilde 'yi MyNamespace ile değiştirin.
Visual Studio'daki bir C++/WinRT projesinde, IntelliSense "hatası E1696: "kaynak dosya açılamıyor" biçiminde bir hata oluşturur. Yeni oluşturduğunuz projenizi en az bir kez derleyin. Ardından Kaynak kodu düzenleyicisine sağ tıklayın >Yeniden Tara>Dosyayı Yeniden Tara. Bu, E1696 da dahil olmak üzere tüm IntelliSense hatalarını çözer.

Uyarı

Bu konu sorunuzu yanıtlamadıysa,Visual Studio C++ geliştirici topluluğunu ziyaret ederek veya Stack Overflowüzerindeki etiketini kullanarak yardım bulabilirsiniz.