Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Note
Untuk informasi tentang menginstal dan menggunakan C++/WinRT Visual Studio Extension (VSIX) (yang menyediakan dukungan templat proyek) lihat dukungan Visual Studio untuk C++/WinRT.
Topik ini ada di depan sehingga Anda segera menyadarinya; bahkan jika Anda belum membutuhkannya. Tabel pemecahan masalah gejala dan solusi di bawah ini mungkin berguna bagi Anda apakah Anda memotong kode baru atau memindahkan aplikasi yang ada. Jika Anda sedang melakukan porting dan ingin segera melanjutkan hingga mencapai tahap saat proyek Anda berhasil dibangun dan dijalankan, Anda dapat membuat kemajuan sementara dengan mengomentari atau membuat stub untuk kode non-esensial yang menimbulkan masalah, lalu kembali lagi nanti untuk membereskan utang teknis tersebut.
Untuk daftar pertanyaan yang sering diajukan, lihat Tanya jawab umum.
Melacak masalah XAML
Pengecualian penguraian XAML mungkin sulit didiagnosis—terutama jika tidak ada pesan kesalahan yang bermakna dalam pengecualian. Pastikan debugger dikonfigurasi untuk menangkap pengecualian kesempatan pertama (untuk mencoba dan menangkap pengecualian penguraian sejak dini). Anda mungkin dapat memeriksa variabel pengecualian dalam debugger untuk menentukan apakah HRESULT atau pesan memiliki informasi yang berguna. Selain itu, periksa jendela output Visual Studio untuk output pesan kesalahan oleh pengurai XAML.
Jika aplikasi Anda berhenti dan yang Anda ketahui hanyalah bahwa terjadi pengecualian yang tidak tertangani saat mengurai markup XAML, hal itu mungkin disebabkan oleh referensi (berdasarkan kunci) ke sumber daya yang tidak ada. Atau, itu bisa menjadi pengecualian yang dilemparkan di dalam UserControl, kontrol kustom, atau panel tata letak kustom. Upaya terakhir adalah pemisahan biner. Hapus sekitar setengah markup dari Halaman XAML dan jalankan kembali aplikasi. Anda kemudian akan tahu apakah kesalahan berada di bagian yang Anda hapus (yang dalam hal apa pun kini harus Anda kembalikan) atau di bagian yang tidak Anda hapus. Ulangi proses ini dengan membagi dua bagian yang berisi kesalahan, lalu lanjutkan dengan cara yang sama hingga Anda berhasil menemukan sumber masalahnya secara tepat.
Gejala dan obat
| Gejala | Obat |
|---|---|
| Pengecualian dilempar saat runtime dengan nilai HRESULT sebesar REGDB_E_CLASSNOTREGISTERED. | Lihat Mengapa saya mendapatkan pengecualian "kelas tidak terdaftar"?. |
| Pengkompilasi C++ menghasilkan kesalahan "'implements_type': bukan anggota kelas dasar langsung atau tidak langsung dari '<jenis> yang diproyeksikan'". | Ini dapat terjadi ketika Anda memanggil make dengan nama yang tidak memenuhi syarat namespace dari jenis implementasi Anda (MyRuntimeClass, misalnya), dan Anda belum menyertakan header jenis tersebut. Pengkompilasi menafsirkan MyRuntimeClass sebagai jenis yang diproyeksikan. Solusinya adalah menyertakan header untuk jenis implementasi Anda (MyRuntimeClass.h, misalnya). |
| Pengkompilasi C++ menghasilkan kesalahan "mencoba mereferensikan fungsi yang dihapus". | Ini dapat terjadi ketika Anda memanggil make dan tipe implementasi yang Anda teruskan sebagai parameter templat memiliki konstruktor default = delete. Edit file header jenis implementasi dan ubah = delete ke = default. Anda juga dapat menambahkan konstruktor ke IDL untuk kelas runtime. |
| Anda telah menerapkan INotifyPropertyChanged, tetapi pengikatan XAML Anda tidak memperbarui (dan UI tidak berlangganan PropertyChanged). | Ingatlah untuk mengatur Mode=OneWay (atau TwoWay) pada ekspresi pengikatan Anda di markup XAML. Lihat kontrol XAML; ikat ke properti C++/WinRT. |
| Anda mengikat kontrol item XAML ke koleksi yang dapat diamati, dan pengecualian dilemparkan pada runtime dengan pesan "Parameter salah". | Dalam IDL dan implementasi Anda, deklarasikan koleksi yang dapat diamati sebagai jenis Windows. Foundation.Collections.IVector<IInspectable>. Namun, kembalikan objek yang mengimplementasikan Windows.Foundation.Collections.IObservableVector<T>, di mana T adalah tipe elemen Anda. Lihat kontrol item XAML; ikat ke koleksi C++/WinRT. |
| Pengkompilasi C++ menghasilkan kesalahan formulir "'MyImplementationType_base<MyImplementationType>': tidak ada konstruktor default yang sesuai yang tersedia". | Ini dapat terjadi ketika Anda menurunkan dari tipe yang memiliki konstruktor nontrivial. Konstruktor jenis turunan Anda perlu meneruskan parameter yang dibutuhkan konstruktor jenis dasar. Untuk contoh lengkap, lihat Menurunkan dari tipe yang memiliki konstruktor nontrivial. |
| Kompilator C++ menghasilkan kesalahan "tidak dapat mengonversi dari 'const std::vector<std::wstring,std::allocator<_Ty>>' menjadi 'const winrt::param::async_iterable<winrt::hstring> &'". | Ini dapat terjadi ketika Anda meneruskan std::vector dari std::wstring ke API Windows Runtime yang mengharapkan koleksi. Untuk informasi selengkapnya, lihat Jenis data C++ Standar dan C++/WinRT. |
| Pengkompilasi C++ menghasilkan kesalahan "tidak dapat mengonversi dari 'const std::vector<winrt::hstring,std::allocator<_Ty>>' menjadi 'const winrt::p aram::async_iterable<winrt::hstring> &'". | Ini dapat terjadi ketika Anda meneruskan std::vector winrt::hstring ke API Windows Runtime asinkron yang mengharapkan koleksi, dan Anda belum menyalin atau memindahkan vektor ke callee asinkron. Untuk informasi selengkapnya, lihat Jenis data C++ Standar dan C++/WinRT. |
| Saat membuka proyek, Visual Studio menghasilkan kesalahan "Aplikasi untuk proyek tidak diinstal". | Jika Anda belum melakukannya, Anda perlu menginstal templat C++ SDK Aplikasi Windows dan C++/WinRT Visual Studio Extension (VSIX) (lihat dukungan Visual Studio untuk C++/WinRT). |
| Pengujian Windows App Certification Kit menghasilkan kesalahan bahwa salah satu kelas runtime Anda "tidak berasal dari kelas dasar Windows. Semua kelas yang dapat dikomposiskan pada akhirnya harus berasal dari jenis di namespace Windows". | Setiap kelas runtime (yang Anda deklarasikan dalam aplikasi Anda) yang berasal dari kelas dasar dikenal sebagai kelas yang dapat disusun . Kelas dasar utama dari kelas yang dapat disusupi harus merupakan jenis yang berasal dari namespace Windows.* atau Microsoft.*; misalnya, Microsoft. UI. Xaml.DependencyObject. Lihat kontrol XAML; ikat ke properti C++/WinRT untuk detail selengkapnya. |
| Kompiler C++ menghasilkan kesalahan "T harus berupa tipe WinRT" pada spesialisasi delegasi EventHandler atau TypedEventHandler. | Pertimbangkan untuk menggunakan winrt::delegate<...T> sebagai gantinya. Lihat Kejadian penulis di C++/WinRT. |
| Pengompilasi C++ menghasilkan kesalahan "T harus jenis WinRT" untuk spesialisasi operasi asinkron Windows Runtime. | Pertimbangkan untuk mengembalikan tugas Pustaka Pola Paralel (PPL) sebagai gantinya. Lihat Operasi konkurensi dan asinkron. |
| Pengkompilasi C++ menghasilkan kesalahan "T harus jenis WinRT" ketika Anda memanggil winrt::xaml_typename. | Gunakan jenis yang diproyeksikan dengan winrt::xaml_typename (misalnya, gunakan BgLabelControlApp::BgLabelControl), dan bukan jenis implementasi(misalnya, jangan gunakan BgLabelControlApp::implementation::BgLabelControl). Lihat kontrol XAML kustom (bertemplat). |
| Pengkompilasi C++ menghasilkan "kesalahan C2220: peringatan diperlakukan sebagai kesalahan - tidak ada file 'objek' yang dihasilkan". | Perbaiki peringatan, atau atur C/C++>General>Treat Warnings As Errors menjadi No (/WX-). |
| Aplikasi Anda mengalami crash karena penanganan aktivitas di objek C++/WinRT Anda dipanggil setelah objek dihancurkan. | Lihat Mengakses pointer ini dengan aman dengan delegasi penanganan peristiwa. |
| Pengkompilasi C++ menghasilkan "kesalahan C2338: Ini hanya untuk dukungan ref yang lemah". | Anda meminta referensi lemah untuk tipe yang meneruskan struct penanda winrt::no_weak_ref sebagai argumen templat ke kelas dasarnya. Lihat Menolak dukungan referensi yang lemah. |
| Pengompilasi C++ menghasilkan "consume_Something: fungsi yang mengembalikan 'otomatis' tidak dapat digunakan sebelum ditentukan" | Lihat C3779: Mengapa kompilator memberi saya kesalahan "consume_Something: fungsi yang mengembalikan 'auto' tidak dapat digunakan sebelum didefinisikan"?. |
| Linker C++ menghasilkan "error LNK2019: Unresolved external symbol" | Lihat Mengapa linker memberi saya kesalahan "LNK2019: Simbol eksternal yang tidak terselesaikan"?. |
| Rangkaian alat LLVM dan Clang menimbulkan galat saat digunakan dengan C++/WinRT. | Kami tidak mendukung TOOLchain LLVM dan Clang untuk C++/WinRT, tetapi jika Anda ingin meniru cara kami menggunakannya secara internal, maka Anda dapat mencoba eksperimen seperti yang dijelaskan di Dapatkah saya menggunakan LLVM/Clang untuk mengkompilasi dengan C++/WinRT?. |
| Pengkompilasi C++ menghasilkan "tidak ada konstruktor default yang sesuai yang tersedia" untuk jenis yang diproyeksikan. | Jika Anda mencoba menunda inisialisasi objek kelas runtime, atau untuk mengonsumsi dan mengimplementasikan kelas runtime dalam proyek yang sama, maka Anda harus memanggil konstruktor std::nullptr_t . Untuk informasi selengkapnya, lihat Menggunakan API dengan C++/WinRT. |
| Pengkompilasi C++ menghasilkan "kesalahan C3861: 'from_abi': pengidentifikasi tidak ditemukan", dan kesalahan lain yang berasal dari base.h. Anda mungkin melihat kesalahan ini jika Anda menggunakan Visual Studio 2017 (versi 15.8.0 atau yang lebih baru), dan menargetkan SDK Windows versi 10.0.17134.0 (Windows 10, versi 1803). | Menargetkan versi yang lebih baru (lebih sesuai) dari SDK Windows, atau atur properti proyek C/C++>Mode Kesuaian>: Tidak (juga, jika /permisif- muncul di properti proyek C/C++>Language>Command Line di bawah Opsi Tambahan, lalu hapus). |
| Pengompilasi C++ menghasilkan "kesalahan C2039: 'IUnknown': bukan anggota ''namespace global''". | Lihat Cara menargetkan ulang proyek C++/WinRT Anda ke versi Windows SDK yang lebih baru. |
| Linker C++ menghasilkan "kesalahan LNK2019: simbol eksternal yang tidak terselesaikan _WINRT_CanUnloadNow@0 direferensikan dalam fungsi _VSDesignerCanUnloadNow@0" | Lihat Cara menargetkan ulang proyek C++/WinRT Anda ke versi Windows SDK yang lebih baru. |
| Proses build menghasilkan pesan kesalahan C++/WinRT VSIX tidak lagi menyediakan dukungan build proyek. Tambahkan referensi proyek ke Microsoft.Windows. Paket CppWinRT Nuget. | Instal paket NuGet Microsoft.Windows.CppWinRT ke proyek Anda. Untuk detailnya, lihat Versi ekstensi VSIX yang lebih lama. |
| Linker C++ menghasilkan kesalahan LNK2019: simbol eksternal yang tidak terselesaikan, dengan penyebutan winrt::impl::consume_Windows_Foundation_Collections_IVector. | Mulai C++/WinRT 2.0, jika Anda menggunakan for berbasis rentang pada koleksi Windows Runtime, maka sekarang Anda perlu #include <winrt/Windows.Foundation.Collections.h>. |
| Pengkompilasi C++ menghasilkan "kesalahan C4002: Terlalu banyak argumen untuk pemanggilan makro seperti fungsi GetCurrentTime". | Lihat Bagaimana cara mengatasi ambiguitas dengan GetCurrentTime dan/atau TRY?. |
| Kompilator C++ menghasilkan "kesalahan C2334: token tak terduga sebelum '{'; melewati isi fungsi yang tampak". | Lihat Bagaimana cara mengatasi ambiguitas dengan GetCurrentTime dan/atau TRY?. |
| Kompilator C++ menghasilkan "winrt::impl::produce<D,I> tidak dapat menginstansiasi kelas abstrak, karena tidak ada GetBindingConnector". | Anda perlu #include <winrt/Microsoft.UI.Xaml.Markup.h>. |
| Pengkompilasi C++ menghasilkan "kesalahan C2039: 'promise_type': bukan anggota 'std::experimental::coroutine_traits<void>'". | Koroutin Anda perlu mengembalikan objek operasi asinkron, atau winrt::fire_and_forget. Lihat Operasi konkurensi dan asinkron. |
| Proyek Anda menghasilkan "akses ambigu ke 'PopulatePropertyInfoOverride'". | Kesalahan ini dapat terjadi ketika Anda mendeklarasikan satu kelas dasar di IDL Anda dan kelas dasar yang berbeda di markup XAML Anda. |
| Memuat solusi C++/WinRT untuk pertama kalinya menghasilkan "Build designtime gagal untuk konfigurasi proyek 'MyProject.vcxproj' 'Debug|x86'. IntelliSense mungkin tidak tersedia.". | Masalah IntelliSense ini akan diselesaikan setelah Anda membangun untuk pertama kalinya. |
| Mencoba menentukan winrt::auto_revoke saat mendaftarkan delegasi menghasilkan pengecualian winrt::hresult_no_interface . | Lihat Jika delegasi pencabutan otomatis Anda gagal terdaftar. |
| Dalam aplikasi C++/WinRT, saat menggunakan komponen C# Windows Runtime yang menggunakan XAML, pengkompilasi menghasilkan kesalahan formulir "'MyNamespace_XamlTypeInfo': bukan anggota 'winrt::MyNamespace'"—di mana MyNamespace adalah nama namespace komponen Windows Runtime. | Dalam pch.h pada aplikasi C++/WinRT konsumen, tambahkan #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>—ganti MyNamespace sesuai kebutuhan. |
| Dalam proyek C++/WinRT di Visual Studio, IntelliSense menghasilkan kesalahan formulir "kesalahan E1696: tidak dapat sumber terbuka file". | Kompilasi proyek yang baru Anda buat setidaknya sekali. Kemudian klik kanan di editor kode sumber >Pindai Ulang>Pindai Ulang File. Itu akan mengatasi semua kesalahan IntelliSense, termasuk E1696. |
Note
Jika topik ini tidak menjawab pertanyaan Anda, maka Anda mungkin menemukan bantuan dengan mengunjungi komunitas pengembang Visual Studio C++, atau dengan menggunakan c++-winrt tag di Stack Overflow.
Topik terkait
Note
Banyak topik C++/WinRT sedang dalam proses migrasi dari dokumentasi UWP ke bagian ini. Hingga migrasi selesai, tautan dalam daftar di bawah ini dapat mengarah ke bagian dokumen UWP. Proyeksi bahasa C++/WinRT sama untuk aplikasi UWP dan WinUI 3, sehingga konten berlaku di kedua konteks. Pola khusus UWP apa pun (seperti siklus hidup aplikasi atau API namespace Windows.UI) disebutkan secara eksplisit dalam artikel-artikel tersebut.
Windows developer