2014-05-25 76 views
1

我正在使用Windows 7,Visual Studio 2012和DirectX 11.今天,我已經將DirectXTex中的「DDSTextureLoader」模塊添加到了我的項目中(我剛剛將DDSTextureLoader.cpp和DDSTextureLoader.h複製到了我的項目文件夾中並添加了它們進入解決方案)。該項目編譯正常,但當我遇到它,它給我以下錯誤:SDK/OS版本不正確?

Entry point in method CreateFile2 can't be found in library DLL KERNEL32.dll

(或某事像,我有Windows的波蘭語版本,所以我不知道有關此錯誤消息的英文對應。)

我發現它有事情做與SDK版本,它可以通過改變#define _WIN32_WINNT的價值_WIN32_WINNT_WIN7(默認爲_WIN32_WINNT_WIN8)在C:\Program Files (x86)\Windows Kits\8.0\Include\shared\sdkddkver.h「固定」。

這樣做後,該項目似乎工作正常,但我不認爲手動編輯SDK的文件,特別是因爲它也用於所有其他項目,是一個很好的解決方案。有沒有更好的方法來擺脫上述錯誤信息?或者,也許我的項目/ SDK設置有一些錯誤?

+0

你應該做的'在自己的項目#define',*前*你有'sdkdkver.h' - 常(取決於您是如何創建的項目)有一些樣板代碼'targetver .h'你可以改變。 –

+0

CreateFile2()是一個Windows 8函數,旨在供WinRT應用程序(Store和Phone)使用。它僅在_WIN32_WINNT> = 0x0602的情況下定義,並且SDK確信您實際上正在創建Store應用程序。您完全不留下面包屑以瞭解這種情況,DDSTextureLoader.cpp肯定有CreateFile2()調用。 –

+0

@HansPassant多年來,我安裝了多個DirectX/Windows SDK,我現在甚至都不確定。我不知道爲什麼我在那裏定義了0x0602以及我犯了一個錯誤的方式。這就是我問的原因。對不起,我不能提供更多細節。但如果你問我關於我的設置的問題,我很樂意回答。 – NPS

回答

1

_WIN32_WINNT控件定義多年來一直由Windows SDK使用,但Windows 8.x SDK中的行爲更改引起了很多混淆:它默認爲「最新」操作系統比支持的「最老」的操作系統。

這意味着當您使用VS 2013構建新項目時,它將默認爲0x0603並且需要Windows 8.1或更高版本。如果使用VS 2012構建相同的桌面項目,則默認爲0x602,並且需要Windows 8.0或更高版本。這對於Windows應用商店應用來說非常合理,但對於Win32桌面來說這真是令人困惑。謝天謝地,修復非常簡單:爲使用VS 2012/VS 2013構建的Win32桌面應用程序添加預處理器定義_WIN32_WINNT = 0x0600。最早支持的Windows 8.x SDK操作系統是Windows Vista(0x0600)。如果您可以指望Windows 7或更高版本,請將其設置爲0x0601。

如果您使用的是「v110_xp」或「v120_xp」平臺工具集,您實際上使用的是可支持Windows XP的Windows 7.1A SDK,並且您已將_WIN32_WINNT設置爲0x0501。

MSDN