1

我已经开始使用 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++ - 介绍 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 社区版开始,我做了以下工作:

  • 文件 -> 新建 -> 项目并使用 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. 进一步搜索找到了这篇文章,Windows SDK 中的 cppwinrt.exe,其中包含一个示例应用程序,该示例应用程序使用该示例应用程序init_apartment();而不是initialize();这样更改我的示例应用程序编译并运行,生成一个文章列表作为输出。

这篇 Microsoft 文档文章C++/WinRT 入门,日期为 2018 年 5 月 7 日,有一个控制台示例使用init_apartment();而不是initialize(). 该示例也是一个 Syndication Feed,但指向不同的 URL。

第二个测试应用程序使用了“Windows Universal”->“Blank App (C++/WinRT)”的C++/WinRT模板,生成了一个编译运行的示例应用程序。在“属性”->“常规”对话框中,“目标平台版本”设置为 10.0.17134.0,“目标平台最小值”设置为 10.0.15063.0。

4

1 回答 1

3

C++/WinRT 投影只是 C++ 标头。除了您正在使用的 Windows 运行时 API 之外,它们本身没有特定的运行时要求。

真正的问题是您在应用程序中使用了哪些 API(通过 C++/WinRT 或使用 C++/CX 语言扩展 (aka )),以及您在构建 UWP 应用程序时/ZW设置了哪些值。WindowsTargetPlatformMinVersion

设置为最新的 Windows 10 SDK ( 17134 WindowsTargetPlatformVersion) 后,您可以将 UWP 应用所需的最低操作系统版本设置为 17134、16299、15063、14393、10586 或 10240。您需要在该版本上测试您的应用程序并确保您保护对较新 API 的任何使用。

从实际的角度来看,您不需要支持 10240,这就是为什么 Visual Studio 中新项目的默认值为 10586。对于消费者版本,14393 与您在现实世界中可能遇到的一样旧。

于 2018-05-08T17:01:00.840 回答