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

Posted

技术标签:

【中文标题】ATL抱怨VS2012后不包括Windows -> VS2017【英文标题】:ATL complains about not including Windows after VS2012 -> VS2017 【发布时间】:2019-05-02 15:03:22 【问题描述】:

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

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

带有诸如“未声明的标识符”之类的错误行是指 windows.h 库中的标头。

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

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

无论我将 Windows.h 放在哪里,都会发生错误。我发现它很可能是由_WIN32_WINNTstuff 生成的,但所有这些“应该”都有效。是否已弃用?我不知道...有人有什么想法吗?

【问题讨论】:

可能与此有关:social.msdn.microsoft.com/Forums/vstudio/en-US/… 这样的语法错误只有在 SDK 安装非常混乱时才容易解释。不只是一个文件,至少是 wtypes.h 和 objbase.h。您需要首先执行“hello world”,创建一个包含这两个标头的 Win32 控制台模式应用程序。如果它也失败了,那么你有一个坏的 SDK,如果没有,那么 /showIncludes 编译选项就变得有用了。请注意,您似乎也没有_UNICODE #defined,在 ATL 项目中不是很健康。我不能确定,这个工具版本相当新,我避免让 vs2017 保持更新。 我已经定义了它,但我“强制”了它并将声明放在包含之前,它起作用了。所以某事,某处它一定已经改变了。不过只剩下一个错误。 C1017 sdkddkver.h 第 272 行内的整数常量表达式无效。 错误地获取WINVER_WIN32_WINNT 的#defines 肯定会造成很大的破坏。你最好检查一下你所有的通心粉。 【参考方案1】:

就我而言,有多个项目包括彼此的 stdafx.h 标头。这导致宏失败/损坏。对其进行排序并使用正确的 WINVER 和 _WIN32_WINNT 值修复了这一切。

【讨论】:

【参考方案2】:

除了 Alexander 的回答,请确保您没有定义以下内容:

#define NOTEXTMETRIC

【讨论】:

以上是关于ATL抱怨VS2012后不包括Windows -> VS2017的主要内容,如果未能解决你的问题,请参考以下文章

从 VS2012 在 C++ 中使用 ATL 创建 COM

在 CI 服务器上构建 ATL VS2010 项目

尽管有一次编译指示,VS2012 仍抱怨“已定义”类

构建 ATL 项目

VS 2010 Build 中的 ATL DCOM 对象创建失败

VS2017项目升级 error LNK2005: "public: __thiscall ATL::CTime::