ATL 抱怨在 VS2012 -> VS2017 之后不包括 Windows

ATL complains about not including Windows after VS2012 -> VS2017

我目前正在将我们的项目从 VS2012 更新到 VS2017。这导致一个项目在编译 ATL 时崩溃和抱怨。

1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(450): error C2143: syntax error: missing ')' before '__stdcall'
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(450): error C2143: syntax error: missing ';' before '__stdcall'
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(450): error C2059: syntax error: '__stdcall'
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(450): error C2059: syntax error: ')'
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(451): error C2065: 'PFNMOVEFILETRANSACTED': undeclared identifier
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(451): error C2146: syntax error: missing ';' before identifier 'pfMoveFileTransacted'
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(451): error C2065: 'pfMoveFileTransacted': undeclared identifier
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(451): error C2146: syntax error: missing ';' before identifier 'GetProcAddress'
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(453): error C2065: 'pfMoveFileTransacted': undeclared identifier
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(455): error C2065: 'pfMoveFileTransacted': undeclared identifier
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(571): error C2143: syntax error: missing ')' before '__stdcall'
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(571): error C2143: syntax error: missing ';' before '__stdcall'
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(571): error C2059: syntax error: '__stdcall'
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(571): error C2059: syntax error: ')'
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(572): error C2065: 'PFNFINDFIRSTFILETRANSACTED': undeclared identifier
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(572): error C2146: syntax error: missing ';' before identifier 'pfFindFirstFileTransacted'
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(572): error C2065: 'pfFindFirstFileTransacted': undeclared identifier
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(572): error C2146: syntax error: missing ';' before identifier 'GetProcAddress'
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(574): error C2065: 'pfFindFirstFileTransacted': undeclared identifier
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(576): error C2065: 'pfFindFirstFileTransacted': undeclared identifier
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(576): error C2065: 'FindExInfoStandard': undeclared identifier
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atltransactionmanager.h(576): error C2065: 'FindExSearchNameMatch': undeclared identifier
1>c:\program files (x86)\microsoft visual studio17\professional\vc\tools\msvc.16.27023\atlmfc\include\atlcom.h(175): error C2065: 'COINIT_MULTITHREADED': undeclared identifier
1>Done building project "MyProj.vcxproj" -- FAILED.

带有错误行,例如 "undeclared identifier" 指的是 windows.h 库中的 headers。

当我包含时,我通过 StdAfx.h 包含;

#include <atlbase.h>
#include <atlcom.h>

无论我把Windows.h放在哪里,都会发生错误。我发现它很可能是由 _WIN32_WINNTstuff 生成的,但所有这些 "should" 都有效。它被弃用了吗?我不知道...有人有什么想法吗?

在我的例子中,有多个项目相互包含 stdafx.h headers。这导致宏 fail/corrupt。对其进行排序并使用正确的 WINVER 值和 _WIN32_WINNT 修复了所有问题。

除了亚历山大的回答之外,请确保您没有定义以下内容:

#define NOTEXTMETRIC