【发布时间】:2018-10-18 16:34:53
【问题描述】:
我已经开始使用 Visual Studio 2017 社区版试验 C++/WinRT。我现在有一个环境,我可以在其中构建示例应用程序的调试版本并运行它。我不得不:
- 下载并安装最新的 Windows 10 SDK
- 使用 C++/WinRT 包和模板更新 Visual Studio 2017
- 将 Windows 10 操作系统更新到最新版本,版本 1803
文档和网页描述了 Visual Studio 的 C++/WinRT 包更新,尝试编译示例时出现错误,提示我下载并安装最新的 Windows 10 SDK。
当我尝试实际运行示例应用程序的调试版本时,我发现我还需要 Windows 10 Build 1803。
Windows 10 Build 1803 是使用标准 C++ 和 C++/WinRT 运行应用程序的必要条件,还是我的经验源于使用调试版本?
这是否意味着尚未将其 Windows 10 安装升级到至少 Windows 10 Build 1803 的用户将无法运行使用 C++/WinRT 开发的应用程序?
企业或商业客户是否有可能在使用自己的特定更新集从自己的服务器进行企业特定升级时选择消除必要的 C++/WinRT 组件,从而使 C++/WinRT 应用程序无法运行?在他们的环境中运行?
是否有某种封装,以便应用程序中包含必要的 C++/WinRT 组件?
附录:两个测试应用程序
我从头开始重试了我使用过的两个测试应用程序。此重试工作是在对安装最新的 Windows 10 SDK 10.0.17134 以及安装 C++/WinRT Visual Studio 扩展并将我的 PC 更新到 Windows 10 1803 进行修改之后进行的。
我尝试的第一个 C++/WinRT 应用程序是来自 Kenny Kerr 的文章C++ - Introducing C++/WinRT 的控制台应用程序,该应用程序具有以下示例应用程序:
#pragma comment(lib, "windowsapp")
#include "winrt/Windows.Foundation.h"
#include "winrt/Windows.Web.Syndication.h"
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Web::Syndication;
int main()
{
initialize(); // NOTE: Generates compiler error C3861: 'initialize': identifier not found
Uri uri(L"http://kennykerr.ca/feed");
SyndicationClient client;
SyndicationFeed feed = client.RetrieveFeedAsync(uri).get();
for (SyndicationItem item : feed.Items())
{
hstring title = item.Title().Text();
printf("%ls\n", title.c_str());
}
}
我终于梳理出一个创建、编译和运行这个测试源的过程如下。从打开 Visual Studio 2017 Community Edition 开始,我做了以下工作:
- 文件 -> 新建 -> 项目和使用 Windows 桌面、Windows 控制台应用程序模板
- 保留
#include "stdafx.h",但将生成的模板main()替换为上述来源 - 在解决方案资源管理器中右键单击解决方案,选择属性,打开 C/C++ -> 语言并将“C++ 语言标准”更改为“ISO C++17 标准 (/std:c++17)”
“配置属性”->“常规”中的“Windows SDK版本”设置为10.0.17134.0。
构建失败,编译错误为error C3861: 'initialize': identifier not found。进一步搜索发现这篇文章cppwinrt.exe in the Windows SDK,其中包含一个使用init_apartment(); 而不是initialize(); 的示例应用程序,因此我的示例应用程序编译并运行生成一个文章列表作为输出。
这篇 Microsoft 文档文章 Get started with C++/WinRT,日期为 2018 年 5 月 7 日,有一个使用 init_apartment(); 而不是 initialize() 的控制台示例。该示例也是一个联合供稿,但指向不同的 URL。
第二个测试应用程序使用了“Windows Universal”->“Blank App (C++/WinRT)”的C++/WinRT模板,生成了一个编译运行的示例应用程序。在“属性”->“常规”对话框中,“目标平台版本”设置为 10.0.17134.0,“目标平台最小值”设置为 10.0.15063.0。
【问题讨论】:
-
从技术上讲,您不需要 C++/WinRT VSIX 扩展。您可以使用通用(本机)Windows 应用程序类型来实现 C++/WinRT 应用程序。从技术上讲,您也不需要(当前)最新的 Windows SDK。仅当您需要 cppwinrt.exe“编译器”时才需要这样做,即,如果您正在创作 Windows 运行时组件,或使用不提供 C++ 头文件的组件。
-
@IInspectable 我不确定你所说的“技术上”是什么意思我不需要最新的 Windows SDK,它似乎是 17134.0,因为除非那是我的“目标平台版本”或“Windows SDK 版本” (取决于解决方案的类型、UWP 应用程序或控制台应用程序)我收到编译器错误。因此,成功编译似乎需要 17134.0。正如你所说,在我看来不需要 C++/WinRT VSIX 扩展,因为我能够使用 Windows 桌面模板创建控制台应用程序。
-
这种说法并不完全正确。 C++/WinRT 头文件仅包含在(当前)最新的 Windows SDK 中。以前,您必须从 - now archived - C++/WinRT GitHub repository 下载标头,或安装适当的 vcpkg。如果您这样做了,则不需要任何特定的 Windows SDK 版本。无论如何,您仍然需要拥有与您选择的目标平台版本匹配的头文件(或更高版本的头文件)。
标签: visual-c++ windows-10 c++-winrt