Winapi 不匹配Windows版本的中断生成:Pathcch.h函数

Winapi 不匹配Windows版本的中断生成:Pathcch.h函数,winapi,windows-8,backwards-compatibility,windows-shell,Winapi,Windows 8,Backwards Compatibility,Windows Shell,此应用程序必须在Windows 7上运行,因此它定义了“#define(u WIN32)WINNT(u WIN32)WINNT(u WINNT)WIN7”。是Windows 8[仅限桌面应用程序],但构建工作正常,因此在Win7运行时会出现意外情况:应用程序无法启动,因为缺少“api-ms-win-core-path-l1-1-0.dll”。标题Pathcch.h定义了以下内容: /* APISET_NAME: api-ms-win-core-path-l1 */ #ifndef _APISE

此应用程序必须在Windows 7上运行,因此它定义了“
#define(u WIN32)WINNT(u WIN32)WINNT(u WINNT)WIN7
”。是
Windows 8[仅限桌面应用程序]
,但构建工作正常,因此在Win7运行时会出现意外情况:应用程序无法启动,因为缺少“api-ms-win-core-path-l1-1-0.dll”。标题Pathcch.h定义了以下内容:

/* APISET_NAME: api-ms-win-core-path-l1 */

#ifndef _APISET_PATH_VER
#ifdef _APISET_MINCORE_VERSION
#if _APISET_MINCORE_VERSION >= 0x0100
#define _APISET_PATH_VER 0x0100
#endif
#endif
#endif
它能被用来。。。以某种方式 或者,如果这是shell,我可以在Windows7中安装一些东西让它工作吗


EDIT
pathalocanonicalize
位于
Pathcch.h
中,它忽略了
\u WINNT

版本宏中没有编译器魔法;所有发生的事情都是这样,而不是

extern void f(void);
在头文件中,Microsoft

#if _VERSION >= _MIN_VERSION
extern void f(void);
#endif
(或类似的东西)。这将使用预处理器作为过滤器,使函数在不受支持的系统上未声明(这就是为什么您会收到关于未声明符号的编译器警告)

因此,您可以自己在项目的头文件中执行此操作。
#error
指令(它是标准C和C++的一部分)将抛出一个编译器错误和您选择的消息。由于您已经决定在源代码中定义WIN32 WINNT WIN32 WINNT WIN7,您可以在项目自己的头文件中粘贴类似的内容,例如
stdafx.h

#if _WIN32_WINNT < _WIN32_WINNT_WIN8
#error Sorry, this program requires Windows 8 or newer.
#endif
\if\u WIN32\u WINNT<\u WIN32\u WINNT\u WIN8
#错误抱歉,此程序需要Windows 8或更新版本。
#恩迪夫
(如果将其放在
\include
之前,则必须替换
\u WIN32\u WINNT\u WIN8
的实际值)包含这些行后,如果有人将
\u WIN32\u WINNT
更改为低于Windows 8的值,则包含该头文件的第一个源文件将导致编译器出错


希望这能满足您的需要。

相关:在编译的二进制文件上运行
dumpbin/imports
。我敢打赌,图书馆正在被连接起来。如果是,您需要在运行时使用
LoadLibrary
GetProcAddress
拉入引用。我想知道的是,构建是否会中断,这样我就可以及早检测到这样的问题。这是
\u WIN32\u WINNT
的意图,那么为什么
Pathcch.h
函数不是这样呢?如果直接调用函数,链接器会将其包含在导入表中。由于链接器在确定导入时引用的库具有该函数,因此它能够解析该函数。如果删除直接函数调用,而是使用
GetProcAddress
获取函数指针,则链接器不知道依赖关系,因此不会将其添加到导入表中。至于导致构建失败,您可以尝试编写一个构建后脚本来检查模块导入,但我不得不在这里向其他人寻求更好的解决方案。是否手动编写
#if versionMacroOfChoice
我不明白这如何阻止某人将
Pathcch.h
包含在其他地方并使用它。我认为您的建议是强制将此标题包含在stdafx.h中,并进行WINNT验证。