【问题标题】:synchronizing SDK with Windows 10 update and using WinRT with Standard C++将 SDK 与 Windows 10 更新同步并将 WinRT 与标准 C++ 结合使用
【发布时间】: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


【解决方案1】:

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

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

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

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

【讨论】:

  • 感谢您的发帖。我将需要根据在家中 PC 上的示例应用程序查看您编写的内容。我记得,虽然我可能弄错了,但我尝试了其他目标并看到了构建错误。我今晚可能需要用实际的示例代码和关于特定目标和设置的一些想法来更新我发布的问题。
  • 您必须针对为 WindowsTargetPlatformVersion 设置的相同 Windows 10 SDK 和匹配的 C++/WinRT 标头构建 - 17134 版本现在包含在最新的 Windows 10 SDK,因此您不再需要不同的包。它仍应在较旧的操作系统上运行
  • 我更新了我发布的问题,更好地解释了我正在使用的两个测试应用程序。我明白你所说的目标平台版本应该设置为 17134,但目标平台最低可以是别的东西。我还没有尝试在尚未升级的 Windows 10 机器上运行它。我想在调查和尝试的过程中,我有点困惑。我从您的评论中了解到,我要么需要旧操作系统版本上的 Windows SDK 17134,要么升级到 Windows build 1803,但我不必两者都做。对吗?
  • 只要您的WindowsTargetPlatformVersion 设置为 10.0.17134,您就可以使用 Windows 10 SDK (17134) 和最新的 C++/WinRT 投影。您根据要支持的 Windows 10 版本设置WindowsTargetPlatformMinVersion,其中应包括您的开发/测试机器。如果您没有正确保护它们的使用,与 Win32 桌面开发没有什么不同,那么与比您的最低版本更新的操作系统相关联的 API 和 API 合同将在运行时失败。
  • 我将 C++/WinRT 控制台应用程序的发布版本复制为 exe 以及一个简单的 .bat 文件,以便在另一个 Windows 10 版本 1703 x64 上运行它并且运行良好。这台 PC 安装了 VS 2017 社区版,并安装了 SDK 10.0.16299.0。我已请朋友使用 Windows 10 IoT Enterprise 进行快速测试。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多