如何使用Visual Studio 2019针对Windows 7进行开发?

3
我希望使用Visual Studio 2019来体验最新的C++功能,但是目标平台是Windows 7。
我在Windows 10上运行VS 2019向导创建了一个Windows C++应用程序。
向导创建了一个名为targetver.h的文件,并包含以下内容:
#pragma once

// // Including SDKDDKVer.h defines the highest available Windows platform.
// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and
// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h.
#include <SDKDDKVer.h>

我按照注释中的指示,在targetver.h文件中添加了以下内容(在#include <SDKDDKVer.h>行之前):

// Target Windows 7 SP1
#include <WinSDKVer.h>
#define _WIN32_WINNT 0x0601

为了测试这一点,在程序的主函数中,我调用了一个在Windows 7中不支持的API(PathCchAppend)。

该程序可以成功构建(我将CRT进行了静态链接),并且在Windows 10上运行正常。

当在Windows 7上执行同一程序时,会显示以下错误信息:

Error message when trying to run the VS 2019 C++ application on Windows 7

现在,程序根本不应该编译,因为我指定了Windows 7目标,而上述API在Windows 7上是不可用的。
这是Windows SDK中的错误吗?
是否可以使用VS 2019和Windows 10 SDK来针对Windows 7,当代码中使用不支持Windows 7的API或结构时,在构建过程中出现错误,该如何处理?

这个回答解决了你的问题吗?Visual Studio 2015运行时依赖项或如何摆脱通用CRT? - undefined
@dewaffled:我稍后会详细阅读你提供的问题链接,但如果它是关于与CRT进行静态链接的问题,我已经做过了。对我来说,这段代码根本不应该编译通过,因为我试图调用一个在Windows 7上不支持的API。 - undefined
你尝试使用的API集合(api-ms-win-core-path-l1-1-0)和API(PathCchAppend)在win7中根本不存在。 - undefined
pathcch.h 中没有任何基于所选版本的条件块。所以编译你的代码没问题,构建也没问题,但只能在Win8及以上版本上运行。 - undefined
@RbMm:那么,明确地定义预处理宏来针对Windows 7有什么意义呢?我原以为如果我尝试调用在Windows 7中不可用的API,应该会在编译时出现错误。 - undefined
2
PathCchAppend在Windows 8中引入。它声明在PathCch.h头文件中,该头文件似乎没有针对SDK版本的任何测试,这就是为什么您的编译成功的原因。这是SDK中的一个错误吗?我想是的。 - undefined
1个回答

1

VS 2019的工具集和最新的Windows 10 SDK支持以Windows 7 Service Pack 1为目标。

您已经正确配置了Windows 10 SDK中的Windows头文件:

#include <winsdkver.h>
#define _WIN32_WINNT 0x0601
#include <sdkddkver.h>

你仍然可以在此模式下调用Windows 7不支持的API,这就是为什么调用PathCchAppend会在运行时构建、链接和失败的原因。
你看到的问题也可能与目标计算机上未安装通用C/C++运行时有关。请在目标测试计算机上安装x86和/或x64本机版本。
请参阅Microsoft Docs

我将CRT静态链接。在Windows 7上,我是否仍然需要安装额外的DLL?我是否可以只部署一个使用VS 2019构建并且与CRT静态链接的单个EXE文件? - undefined
此外,我预计会出现构建失败的情况,因为我故意尝试调用一个在Windows 7上不支持的API。 - undefined
与crt无关的问题 - api-ms-win-core-path-l1-1-0(又名kernelbase)和PathCchAppend不是crt。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接