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_WINNT
stuff 生成的,但所有这些“应该”都有效。是否已弃用?我不知道...有人有什么想法吗?
【问题讨论】:
可能与此有关: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的主要内容,如果未能解决你的问题,请参考以下文章