2012-05-24 148 views
1

我試圖在Visual Studio 2010中編譯程序在Windows 7我得到一個編譯錯誤C2061:語法錯誤:在Windows頭shlobj.h標識符「KNOWN_FOLDER_FLAG」在標線:C++ WinSDK頭編譯錯誤

#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 

有什麼可以爲它不能編譯的原因嗎?

在我看來,我得到錯誤的部分一定不能編譯,但它不知道怎麼做。

+1

你是如何包括SHLOBJ.H聲明ShlObj頭 做工精細 - 直接或間接?某些Windows頭文件需要通過windows.h間接包含才能正確編譯。有些你可以直接包含,但只有你首先包含windows.h。在你的代碼中,什麼使得你現在擁有的包含? – Dabbler

+0

我使用MFC,我推測它包含shlobj.h文件。 – grzkv

回答

1

只有一個合乎邏輯的結論:由於某種原因,當編譯這個頭文件時擴展NTDDI_VERSION並不是你認爲的那樣。

嘗試通過搜索#undef NTDDI_VERSION進行故障排除,並對項目進行清理構建(如果您使用預編譯頭文件,則可能相關)。

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上工作 - 這是因爲該API在XP上不存在。所以你必須做LoadLibrary/GetProcAddress技巧來調用API。

+0

這不回答操作的問題。他定義了NTDDI_XP,因此不包括NTDDI_VISTA垃圾,但是在同一個頭文件中包含NTDDI_WIN7(應該大於NTDDI_VISTA並依賴於它)以進行編譯。 –

+0

啊,你是對的,我沒有向下滾動他的代碼示例。 –

0

變化

定義NTDDI_VERSION NTDDI_WINXP

定義NTDDI_VERSION NTDDI_VISTA

之前在Windows 10