C ++ WinSDK头编译错误

时间:2012-05-24 13:21:28

标签: c++ windows visual-studio-2010

我正在尝试在Windows 7中的Visual Studio 2010中编译程序。我在Windows标头shlobj.h中收到编译错误 C2061:语法错误:标识符'KNOWN_FOLDER_FLAG'标记行:

#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 DWORD /* KNOWN_FOLDER_FLAG */ dwFlags,
                            __in_opt HANDLE hToken,
                            __in PCWSTR pszPath);

STDAPI SHGetKnownFolderPath(__in REFKNOWNFOLDERID rfid,
                            __in DWORD /* KNOWN_FOLDER_FLAG */ dwFlags,
                            __in_opt HANDLE hToken,
                            __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

在我的程序中,版本宏被定义为folows

#define NTDDI_VERSION NTDDI_WINXP

它不能编译的原因是什么?

在我看来,我收到错误的部分一定不能编译,但不知怎的。但/ / p>

3 个答案:

答案 0 :(得分:1)

只有一个合乎逻辑的结论:由于某种原因,编译此标题时NTDDI_VERSION的扩展不是您认为的那样。

尝试通过搜索#undef NTDDI_VERSION进行故障排除并对项目进行干净的构建(如果使用预编译的标头,则可能相关)。

答案 1 :(得分:1)

编辑:我的回答是在没有向下滚动代码示例的情况下编写的...... 您是否确认错误来自定义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上运行 - 这是因为XP上不存在该API。因此,您必须使用LoadLibrary / GetProcAddress技巧来调用API。

答案 2 :(得分:0)

变化

定义NTDDI_VERSION NTDDI_WINXP

定义NTDDI_VERSION NTDDI_VISTA

在声明ShlObj标头之前

在Windows 10中正常工作