15、WinRT开发:组件、模板与自定义元素详解

WinRT开发:组件、模板与自定义元素详解

1. 集合操作与优化

在处理集合时,如 std::vector 及其WinRT包装器(如 Vector<T> ),应尽可能使用 std::vector ,仅在从WinRT类导出时使用 Vector<T> 。因为原生C++类型的开销比WinRT类型小,这是由WinRT基于接口的特性决定的。

以下是一个简单的示例,展示了如何优化 Reviews 属性的实现:

_reviews = reviews->GetView();
}
return _reviews;
}

该属性实现尝试通过缓存 IVectorView<BookReview> 结果来进行优化。如果没有添加新的评论,或者该属性从未被调用(通过 _reviews 中的 nullptr 表示),则直接返回缓存结果。否则,会创建 Vector<BookReview> ,并使用 IVector<BookReview>::Append 添加 BookReview 对象。

添加评论的方法 AddReview 实现如下:


                
你遇到的这个错误属于 **链接器错误(Linker Error)**,具体是: ``` 1>XamlTypeInfo.g.obj : error LNK2005: _wWinMain@16 already defined in App.obj 1>App.obj : error LNK2019: unresolved external symbol "public: __thiscall winrt::hello_winrt::implementation::App::App(void)" ... 1>D:\workspace\foo_project\hello_winrt\Debug\hello_winrt\hello_winrt.exe : fatal error LNK1120: 1 unresolved externals ``` --- ### 🔍 错误分析 #### 🔴 1. `_wWinMain@16 already defined` 这个错误表示:**`_wWinMain@16` 函数(即 Windows 应用程序入口点)被多次定义**。 - `XamlTypeInfo.g.obj` 和 `App.obj` 中都定义了它。 - 正常情况下,入口点应该只有一个:`wWinMain`,它通常在 `App.cpp` 中由 C++/WinRT 自动生成。 #### 🔴 2. `unresolved external symbol "App::App(void)"` 这个错误表示:**你定义了 `App` 类的接口(在 IDL 中),但没有实现它的构造函数**。 - 编译器在 `App.obj` 中找不到 `winrt::hello_winrt::implementation::App` 的构造函数实现。 - 也就是说,你在 `.idl` 文件中声明了 `App` 类,但在 `.cpp` 文件中没有实现它。 --- ### ✅ 解决方案 #### ✅ 1. 确保只有一个 `wWinMain` 入口函数 - 检查项目中是否有多个 `App.cpp` 文件。 - 确保 `XamlTypeInfo.g.cpp` 没有被错误地包含为源文件(它是一个生成文件,不应被添加到项目中)。 - 如果你手动添加了 `XamlTypeInfo.g.cpp` 到项目中,请 **移除它**。 #### ✅ 2. 实现 `App` 类的构造函数 如果你在 `.idl` 文件中定义了一个 `App` 类(通常是 `App.idl`): ```idl namespace winrt::hello_winrt::implementation { runtimeclass App : Windows.UI.Xaml.Application { App(); } } ``` 那么你必须在 `App.cpp` 中实现它: ```cpp // App.cpp #include "pch.h" #include "App.h" #include "App.g.cpp" namespace winrt::hello_winrt::implementation { App::App() { InitializeComponent(); } } ``` #### ✅ 3. 确保 `App.h` 中也声明了构造函数 ```cpp // App.h #pragma once #include "App.g.h" namespace winrt::hello_winrt::implementation { struct App : AppT<App> { App(); // 声明构造函数 }; } ``` --- ### 🧹 额外检查建议 - 确保项目中没有重复的入口点文件(如多个 `App.cpp` 或 `Main.cpp`)。 - 如果你使用的是模板项目,请确认没有手动修改或删除了必要的实现文件。 - 清理项目并重新生成:Build → Clean,然后 Build → Rebuild。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值