我想在Windows 7中编译Visual Studio 2010中的程序。我得到一个编译错误C2061:语法错误:标识符'KNowN_FOLDER_FLAG'在Windows标题shlobj.h在标记的行:
#if (NTDDI_VERSION >= NTDDI_VISTA) typedef enum { KF_FLAG_DEFAULT = 0x00000000,KF_FLAG_CREATE = 0x00008000,KF_FLAG_DONT_VERIFY = 0x00004000,KF_FLAG_DONT_UNEXPAND = 0x00002000,KF_FLAG_NO_ALIAS = 0x00001000,KF_FLAG_INIT = 0x00000800,KF_FLAG_DEFAULT_PATH = 0x00000400,KF_FLAG_NOT_PARENT_RELATIVE = 0x00000200,KF_FLAG_SIMPLE_IDLIST = 0x00000100,KF_FLAG_ALIAS_ONLY = 0x80000000,} KNowN_FOLDER_FLAG; DEFINE_ENUM_FLAG_OPERATORS(KNowN_FOLDER_FLAG); STDAPI SHGetKNownFolderIDList(__in REFKNowNFOLDERID rfid,__in DWORD /* KNowN_FOLDER_FLAG */ dwFlags,__in_opt HANDLE hToken,__deref_out PIDLIST_ABSOLUTE *ppidl); STDAPI SHSetKNownFolderPath(__in REFKNowNFOLDERID rfid,__in PCWSTR pszPath); STDAPI SHGetKNownFolderPath(__in REFKNowNFOLDERID rfid,__deref_out PWSTR *ppszPath); #endif // NTDDI_VISTA #if (NTDDI_VERSION >= NTDDI_WIN7) STDAPI SHGetKNownFolderItem(__in REFKNowNFOLDERID rfid,__in KNowN_FOLDER_FLAG flags,<<<ERROR AT THIS LINE __in_opt HANDLE hToken,__in REFIID riid,__deref_out void **ppv); #endif // NTDDI_WIN7
在我的程序中,版本macros定义为folows
#define NTDDI_VERSION NTDDI_WINXP
什么可能是它不编译的原因?
在我看来,我得到错误的部分一定不能被编译,但它不知何故。
Windows ListView控件(或类似的),可以有多列checkBox?
如何在Windows上安装MSVS 2010的LAPACK?
如何用cmake生成.msi安装程序?
stdafx.h的目的(和:为什么这不工作?)
解决无法parsing的外部符号CSourceSeeking :: CSourceSeeking(…),尽pipe与正确的库链接
程序崩溃 – 如何阅读appcompat.txt?
Visual Studio 2010 win32编译的应用程序不能在Windows XP上工作
无法在vc ++ mfc应用程序中分配1.5GB内存
DirectX10交换链和设备指向0x00000000(导致运行时错误)(c ++)
函数CWnd :: CreateControl成功,但m_hWnd是NULL
只有一个合乎逻辑的结论:由于某种原因,当编译这个头文件时NTDDI_VERSION的扩展不是你所想象的。
尝试通过搜索#undef NTDDI_VERSION进行故障排除, #undef NTDDI_VERSION项目进行干净的构建(如果使用预编译头文件,则可能是相关的)。
编辑:我的答案写入没有向下滚动的代码示例…你确认错误来自定义SHGetKNownFolderItem行? 当遇到这类问题时,我通常会为您的文件创建一个预处理器输出文件,并确认错误实际上来自您期望的地方。 有可能是有一些代码不正确NTDDI_VERSION守护。
Windows SDK标头的构建允许您为特定版本的Windows构建应用程序。
在这种情况下,您已经要求为Windows XP构建应用程序(通过将NTDDI_VERSION设置为NTDDI_WINXP)。 那很棒。 但是,然后你试图使用在Windows Vista中引入的枚举(KNowN_FOLDER_FLAG)。
您需要做出选择:使用Windows Vista版本的Windows API(通过将NTDDI_VERSION设置为NTDDI_VISTA)构建您的应用程序,或找出另一种分离Windows Vista特定功能的方法。
有几种方法可以做到这一点。 第一个(也是最棘手的)是用Vista标头构建应用程序,然后小心避免在XP上使用仅Vista的功能。 或者,你可以在另一个源文件/ DLL中隔离特定于Vista的功能,并用NTDDI_VISTA编译该文件。 那么当你不在XP上时,只能调用Vista的特定功能。
请注意,如果您将直接调用SHGetKNownFolderPath添加到您的应用程序,它将无法在Windows XP上工作 – 这是因为该API不存在于XP上。 所以你必须做LoadLibrary / GetProcAddress技巧来调用API。
更改
定义NTDDI_VERSION NTDDI_WINXP
至
定义NTDDI_VERSION NTDDI_VISTA
在声明之前ShlObj头在Windows 10中正常工作
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。