windows C++ WinSDK头编译错误

inn6fuwd  于 2023-03-24  发布在  Windows
关注(0)|答案(3)|浏览(170)

我试图在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 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

在我的程序中,版本宏定义如下

#define NTDDI_VERSION NTDDI_WINXP

它不能编译的原因是什么?
在我看来,我得到错误的部分一定根本不是编译的,但它不知何故是编译的。

nbysray5

nbysray51#

只有一个合乎逻辑的结论:由于某些原因,在编译这个头文件时,NTDDI_VERSION的扩展并不是你想象的那样。
尝试通过搜索#undef NTDDI_VERSION并对项目进行干净的构建来进行故障排除(如果您使用的是预编译头文件,则可能与此相关)。

nlejzf6q

nlejzf6q2#

编辑:我的答案是在没有向下滚动代码示例的情况下写的...你有没有确认错误来自定义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的功能。或者,您可以将Vista特定功能隔离在另一个源文件/dll中,并使用NTDDI_VISTA编译该文件。然后只在不在XP上时调用Vista特定功能。
请注意,如果您在应用程序中添加对SHGetKnownFolderPath的直接调用,它将无法在Windows XP上工作-这是因为XP上不存在该API。因此您必须使用LoadLibrary/GetProcAddress技巧来调用该API。

rkkpypqq

rkkpypqq3#

变化

#define NTDDI_VERSION NTDDI_WINXP

#define NTDDI_VERSION NTDDI_VISTA

声明前ShlObj头
在Windows 10中工作正常

相关问题