備註
如需安裝和使用 C++/WinRT Visual Studio 延伸模組 (VSIX) 的資訊(提供專案範本支援),請參閱 Visual Studio C++/WinRT支援。
這個主題已經被擺在最前面,好讓您馬上能夠知道它,即使您目前還不需要它。 以下故障排除徵兆和補救措施的表格無論對於您是撰寫新程式代碼或者移植現有的應用程式都很有幫助。 如果您要移植,而且您渴望向前邁進,並進入專案建置和執行的階段,則可以透過批注或插斷任何造成問題的非必要程式碼進行暫時性進度,然後稍後返回償還債務。
如需常見問題的清單,請參閱 常見問題。
追查 XAML 問題
XAML 剖析例外狀況可能難以診斷,特別是例外狀況內沒有有意義的錯誤訊息時。 請確定已將偵錯工具設定為捕捉第一機會例外(以便及早捕捉剖析例外狀況)。 您可以檢查調試程式中的例外狀況變數,以判斷 HRESULT 或訊息是否有任何有用的資訊。 此外,請檢查 Visual Studio 的輸出視窗,以取得 XAML 剖析器所輸出的錯誤訊息。
如果您的應用程式終止,而您所知道的是在 XAML 標記剖析期間發生了未處理的例外狀況,則可能是由於參考(依索引鍵)遺漏資源導致的。 或者,這可能是在UserControl、自定義控件或自定義版面配置面板內擲回的例外狀況。 最後的手段是二進位劃分。 從 XAML 頁面移除大約一半的標記,然後重新執行應用程式。 然後,您將知道錯誤是否位於您移除的一半內(不論如何,您現在都應該還原這部分)或未移除的一半。 重複這個過程,方法是分割包含錯誤的部分,依此類推,直到找出問題所在為止。
徵兆和補救措施
| 癥狀 | 補救 |
|---|---|
| 在執行時拋出例外狀況,其 HRESULT 值為 REGDB_E_CLASSNOTREGISTERED。 | 請參閱 為什麼我收到「類別未註冊」例外狀況?。 |
| C++編譯器產生的錯誤為:“'implements_type':不是<投影類型>的任何直接或間接基類的成員。” | 當您呼叫 使用實作類型的命名空間未限定名稱進行 時,就會發生這種情況(例如,MyRuntimeClass),而且您尚未包含該類型的標頭。 編譯程式會將 MyRuntimeClass 解譯為投影類型。 解決方案是包含實作類型的標頭(例如MyRuntimeClass.h)。 |
| C++編譯程式會產生錯誤「嘗試參考已刪除的函式」。 | 當您呼叫 來執行,並且您作為範本參數傳遞的實作類型具有 = delete 預設建構函式時,就會發生這種情況。 編輯實作類型的標頭檔,並將 = delete 變更為 = default。 您也可以將建構函式新增到執行階段類別的IDL中。 |
| 您已實作 INotifyPropertyChanged,但您的 XAML 系結未更新(且 UI 未訂閱 PropertyChanged)。 | 請記得在 XAML 標記中的繫結運算式上設定 Mode=OneWay (或 TwoWay)。 請參閱 XAML 控制件;繫結至 C++/WinRT 屬性。 |
| 您正在將 XAML 項目控制項繫結至可觀察的集合,執行時拋出例外,顯示訊息:「參數不正確」。 | 在 IDL 和實作中,將任何可觀察的集合宣告為類型 Windows.Foundation.Collections.IVector<IInspectable>。 但會傳回實作 Windows.Foundation.Collections.IObservableVector<T>的物件,其中 T 是您的元素類型。 請參閱 XAML 項目控制項;綁定到 C++/WinRT 集合。 |
| C++編譯器會產生格式為 “'MyImplementationType_base<MyImplementationType>':沒有適當的預設建構函式”的錯誤。 | 當您衍生自具有非簡單建構函式的類型時,就會發生這種情況。 衍生型別的建構函式必須傳遞基底類型建構函式所需的參數。 如需工作範例,請參閱 衍生自具有非簡單建構函式的類型。 |
| C++編譯程式會產生錯誤「無法從 'const std::vector<std::wstring, std::allocator<_Ty>>' 轉換成 'const winrt::param::async_iterable<winrt::hstring> &'」。 | 當您將 std::wstring 的 std::vector 傳遞至預期集合的 Windows 運行時間 API 時,就會發生這種情況。 如需詳細資訊,請參閱 Standard C++ 資料類型和 C++/WinRT。 |
| C++編譯程式會產生錯誤「無法從 'const std::vector<winrt::hstring,std::allocator<_Ty>>' 轉換成 'const winrt::param::async_iterable<winrt::hstring> &'」。 | 當您將 winrt::hstring 的 std::vector 傳遞至預期集合的異步 Windows 運行時間 API,而且您既未複製向量,也不會將向量移至異步被呼叫者時,就會發生這種情況。 如需詳細資訊,請參閱 Standard C++ 資料類型和 C++/WinRT。 |
| 開啟專案時,Visual Studio 會產生錯誤「未安裝專案的應用程式」。 | 如果您尚未安裝,您需要在 Visual Studio 的 [新增專案] 對話框中安裝 C++ 開發的 Windows 通用工具。 如果這無法解決問題,則專案可能取決於 C++/WinRT Visual Studio 延伸模組 (VSIX) (請參閱 Visual Studio 對 C++/WinRT 的支援。 |
| Windows 應用程式認證套件測試會產生錯誤,指出其中一個運行時間類別“不是衍生自 Windows 基類。所有可撰寫類別最終都必須衍生自 Windows 命名空間中的類型” | 衍生自基類的執行階段類別(您在應用程式中宣告)稱為 可組合 類別。 可組合類別的最終基類必須是源自 Windows.* 命名空間的類型;例如,Windows.UI.Xaml.DependencyObject。 請參閱 XAML 控制件;如需詳細資訊,請系結至C++/WinRT 屬性。 |
| C++編譯程式會產生 “T 必須是 EventHandler 或 TypedEventHandler 委派特製化的 WinRT 類型” 錯誤。 | 建議您考慮使用 winrt::delegate<... T>。 請參閱 C++/WinRT中的 Author 事件。 |
| C++ 編譯器對 Windows 執行階段異步操作特例化會產生「T 必須是 WinRT 類型」錯誤。 | 請考慮改為傳回平行模式程式庫 (PPL) 工作。 請參閱 並行和異步操作。 |
| 當您呼叫 winrt::xaml_typename時,C++編譯程式會產生 「 |
使用投影類型搭配 winrt::xaml_typename (例如,使用 BgLabelControlApp::BgLabelControl),而非實作類型(例如,請勿使用 BgLabelControlApp::implementation::BgLabelControl)。 請參閱 XAML 自訂(樣板化)控制項。 |
| C++編譯器會產生“錯誤 C2220:將警告視為錯誤 - 不會產生任何 'object' 檔案”。 | 請更正警告,或在 C/C++>一般>中將「將警告視為錯誤」 設定為 否 (/WX-)。 |
| 您的應用程式當機,因為C++/WinRT 物件中的事件處理程式會在物件終結之後呼叫。 | 請參閱 使用事件處理委派安全地存取 此 指標。 |
| C++編譯程式會產生「錯誤 C2338:這僅適用於弱引用支持」。 | 您正在為一個將 winrt::no_weak_ref 標記結構做為範本參數傳遞給其基類的類型請求一個弱引用。 請參閱 選擇退出弱引用支援。 |
| C++編譯程式會產生 “consume_Something: 傳回 'auto' 的函式在定義之前無法使用」 | 請參閱 C3779:為什麼編譯器會給我「consume_Something:傳回 'auto' 的函式無法在定義之前使用」的錯誤?。 |
| C++鏈接器會產生「錯誤 LNK2019:無法解析的外部符號」 | 請參閱 為什麼連結器會給我一個「LNK2019:未解決的外部符號」錯誤?。 |
| 當搭配 C++/WinRT 使用時,LLVM 和 Clang 工具鏈會產生錯誤。 | 我們不支持適用於 C++/WinRT 的 LLVM 和 Clang 工具鏈,但如果您想要模擬如何在內部使用它,則可以嘗試實驗,例如 如何使用 LLVM/Clang 編譯C++/WinRT 中所述的實驗?。 |
| C++ 編譯器對於預期型別產生「沒有適當的預設建構函式」。 | 如果您嘗試延遲運行時間類別物件的初始化,或在相同的專案中取用及實作運行時間類別,則必須呼叫 std::nullptr_t 建構函式。 如需詳細資訊,請參閱 使用 C++/WinRT取用 API。 |
| C++編譯程式會產生“錯誤 C3861: 'from_abi': 找不到標識符”,以及其他源自 base.h的錯誤。 如果您使用 Visual Studio 2017(15.8.0 版或更新版本),並以 Windows SDK 10.0.17134.0 版為目標,您可能會看到此錯誤(Windows 10 版本 1803)。 | 以較新版本的 Windows SDK 為目標,或者設定專案屬性 C/C++>語言>一致性模式:否(此外,如果 C/C++>> 的 [其他選項]中出現 /permissive-,則刪除它)。 |
| C++編譯程式產生「錯誤 C2039:'IUnknown' 不屬於『global namespace』」。 | 請參閱 如何將您的 C++/WinRT 專案重新定向到更新版本的 Windows SDK。 |
| C++連接器會產生「錯誤 LNK2019:在函式 _VSDesignerCanUnloadNow@0 中引用的未解析外部符號 _WINRT_CanUnloadNow@0」 | 請參閱 如何將您的 C++/WinRT 專案重新定向到更新版本的 Windows SDK。 |
| 建置程式會產生錯誤訊息 C++/WinRT VSIX 不再提供專案建置支援。請將項目參考新增至 Microsoft.Windows.CppWinRT Nuget 套件。 | 將 Microsoft.Windows.CppWinRT NuGet 套件安裝到您的專案中。 如需詳細資訊,請參閱 舊版 VSIX 擴充功能。 |
| C++鏈接器會產生 錯誤 LNK2019:未解析的外部符號,並提及 winrt::impl::consume_Windows_Foundation_Collections_IVector。 | 自 C++/WinRT 2.0開始,如果您在 Windows 執行時間集合上使用範圍型 for,則現在必須 #include <winrt/Windows.Foundation.Collections.h>。 |
| C++編譯器會出現“錯誤 C4002:類函數巨集調用 GetCurrentTime”參數過多。 | 請參閱 如何使用 GetCurrentTime 和/或 TRY 解決模棱兩可?。 |
| C++ 編譯器會產生“錯誤 C2334:在 '{' 前有非預期符號;略過似乎是函數體的部分”。 | 請參閱 如何使用 GetCurrentTime 和/或 TRY 解決模棱兩可?。 |
| C++編譯器產生 "winrt::impl::produce<D,I> 無法具現化抽象類,因為遺漏 GetBindingConnector"。 | 您必須 #include <winrt/Windows.UI.Xaml.Markup.h>。 |
| C++編譯程式會產生“錯誤 C2039: 'promise_type': 不是 'std::experimental::coroutine_traits<void>'”的成員。 | 您的協程需要傳回非同步操作物件,或者 winrt::fire_and_forget。 請參閱 並行和異步操作。 |
| 您的專案會產生 「』PopulatePropertyInfoOverride'“ 的模棱兩可存取。 | 當您在IDL中宣告一個基類,並在 XAML 標記中宣告不同的基類時,就會發生此錯誤。 |
| 第一次載入 C++/WinRT 解決方案時,會產生 “Designtime 建置失敗,專案 'MyProject.vcxproj' 配置 'Debug|x86'。IntelliSense 可能無法使用。”。 | 第一次建置之後,此 IntelliSense 問題將會解決。 |
| 註冊委派時,嘗試指定 winrt::auto_revoke,會產生 winrt::hresult_no_interface 例外狀況。 | 請參閱 如果您的自動撤銷委派無法註冊。 |
| 在 C++/WinRT 應用程式中,當使用 XAML 的 C# Windows 執行階段元件 時,編譯器會產生類似 “'MyNamespace_XamlTypeInfo':不是 ‘winrt::MyNamespace’的成員” 的錯誤,其中 MyNamespace 是 Windows 執行階段組件命名空間的名稱。 | 在使用 C++/WinRT 應用程式中的 pch.h 中,新增 #include <winrt/MyNamespace.MyNamespace_XamlTypeInfo.h>—視需要替換 MyNamespace。 |
| 在 Visual Studio 的 C++/WinRT 專案中,IntelliSense 會顯示錯誤訊息,格式如下:「錯誤 E1696:無法開啟原始碼檔案」。 | 至少編譯新建立的專案一次。 然後在原始碼編輯器中按滑鼠右鍵,>重新掃描>重新掃描檔案。 這會解決所有 IntelliSense 錯誤,包括 E1696。 |
備註
如果本主題未回答您的問題,您可以流覽