由于 Windows 平台 #defines 导致的 MFC 编译错误。 努力诊断原因。

编程


我正在使用最新的 Visual Studio 2022 / C++ / MFC、Windows SDK 10.0、平台工具集 10.0(最新安装版本)、C++ 语言标准 ISO C++ 17 标准和构建 64 位。

我从标准 MDI 模板开始,添加了一些内容(Scintilla 编辑控件,需要 >= ISO C++ 17)并成功编译。

现在,我正在集成以前开发的现有源代码(在 ISO C++ 14 下编译,但这可能不是我将要描述的内容的解释)。

我的编译现在失败并出现以下错误:

Error	C1189	#error:  CTaskDialog is not supported on Windows versions prior to Vista.	Visual SQL Studio	C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.38.33130\atlmfc\include\afxtaskdialog.h	18		

… 和

Error	C2664	'INT getaddrinfo(PCSTR,PCSTR,const ADDRINFOA *,PADDRINFOA *)': cannot convert argument 1 from 'LPCTSTR' to 'PCSTR'	Visual SQL Studio	C:\Program Files\Microsoft Visual Studio\2022\Professional\VC\Tools\MSVC\14.38.33130\atlmfc\include\atlsocket.h	163		

所以,不在我的代码中。 在这两种情况下,都有基于 Windows 版本#defines 的条件编译。 例如,对于第一个错误,代码为:

#if (NTDDI_VERSION < NTDDI_VISTA) // min Windows Vista required
#error CTaskDialog is not supported on Windows versions prior to Vista.
#endif

我对此的解释是编译器认为 NTDDI_VERSION 的值小于 NTDDI_VISTA 的值,因此引发错误。

但是,我只使用项目模板为 pch.h、framework.h 和 targetver.h 创建的所有默认值,这(如果我的理解是正确的)相当于

#include <SDKDDKVer.h>

所以,我对这个问题的解释或解决办法摸不着头脑。 我绝对不会在其他地方重新定义 Windows 版本#defines。 不过,我认为

NTDDI_VERSION

实际上在应用版本测试的头文件中未定义,因为此编辑(我知道是亵渎的)会导致编译成功:

#undef NTDDI_VERSION
#define NTDDI_VERSION NTDDI_WIN10

#if (NTDDI_VERSION < NTDDI_VISTA) // min Windows Vista required
#error CTaskDialog is not supported on Windows versions prior to Vista.
#endif

显然,编辑 AfxTaskDialog.h 不是一个可接受的解决方案,因此我将非常感谢有关如何诊断/解决此问题的任何建议。

框架/平台定义摘要

pch.h – #include“framework.h”作为第一行。
Framework.h – #include“targetver.h”作为第一行
targetver.h – #include 作为第一行

我尝试过的:

我已在 pch.h 和/或 Framework.h 和/或 targetver.h 中明确#define NTDDI_VERSION。 我通过硬编码 NTDDI_VERSION 强制 NTDDI_VERSION 通过 #if (NTDDI_VERSION < NTDDI_VISTA) 测试(可以工作,但不是可行的解决方案)。

解决方案1

要找出 C/C++ 高级选项卡上编译器设置下的第一个问题,请选择“显示包含”,它会在构建期间显示包含序列 – 通过这种方式,您可以找到 NTDDI_VERSION 在您感兴趣的文件之前完全定义,或者它可能在某处未定义。 还要确保首先包含 SDKDDKVer.h – 尝试将其首先放入预编译头文件 (pch.h)
第二个错误是 TCHAR 定义为 UNICODE 字符,但函数需要 CHAR。 将设置更改为 MBCS 而不是 UNICODE(属性中的常规选项卡并选择“字符集”值) – 如果它不是您的代码,这可能会有所帮助,否则您可以找出代码中传递的参数。

希望这有帮助。

问候,
格言。

コメント

タイトルとURLをコピーしました