2011-01-22 58 views
8

Using the Windows Headers中,Microsoft聲稱可以使用_WIN32_WINNT和NTDDI_VERSION來防止爲較新版本的Windows定義API函數。但是,這似乎並不普遍。WINVER和WINDOWS.h中的_WIN32_WINNT警衛發生了什麼?

例如,CancelSynchronousIo需要Vista或更高版本,但在Windows SDK的兩個版本(v6.0和v7.1)中完全沒有保護。

WINBASEAPI 
BOOL 
WINAPI 
CancelIoEx(
    __in HANDLE hFile, 
    __in_opt LPOVERLAPPED lpOverlapped 
    ); 

同時,GetVolumeInformationByHandleW,這也需要Vista中,被守衛你可能期望:

#if(_WIN32_WINNT >= 0x0600) 
WINBASEAPI 
BOOL 
WINAPI 
GetVolumeInformationByHandleW(
    __in  HANDLE hFile, 
    __out_ecount_opt(nVolumeNameSize) LPWSTR lpVolumeNameBuffer, 
    __in  DWORD nVolumeNameSize, 
    __out_opt LPDWORD lpVolumeSerialNumber, 
    __out_opt LPDWORD lpMaximumComponentLength, 
    __out_opt LPDWORD lpFileSystemFlags, 
    __out_ecount_opt(nFileSystemNameSize) LPWSTR lpFileSystemNameBuffer, 
    __in  DWORD nFileSystemNameSize 
    ); 
#endif /* _WIN32_WINNT >= 0x0600 */ 

是這樣的事情只是一個錯誤? _WIN32_WINT衛兵是無用的嗎?任何人都可以推薦一種可靠的方法來確定哪個版本的Windows引入了哪些API函數?

編輯補充:

這裏是一個考驗。 foo.h中包含:

#include <windows.h> 

然後運行:

cl /E /D_WIN32_WINNT=0x0501 /DNTDDI_VERSION=0x05010000 foo.h | grep CancelSynchronousIo 

我意料的是,我得不到任何輸出,而是CancelSynchronousIo定義。

+1

我使用MSDN。我會提供鏈接,但我看到你已經擁有了。具體而言,「要求」部分提供「最低支持的客戶端」和「最低支持的服務器」。還有興趣:[WINVER,_WIN32_WINNT,_WIN32_WINDOWS和_WIN32_IE有什麼區別?](http://blogs.msdn.com/b/oldnewthing/archive/2007/04/11/2079137.aspx)。 – 2011-01-22 17:49:09

回答

7

這是一個錯誤。參考例are herehere。一些次要證據表明,Longhorn項目確實是一個非常困難的項目。 Windows團隊不會像DevDiv那樣收到反饋,很難修正錯誤。您可以在MSDN Library頁面的底部留下注釋。

+3

所以我決定做一個小實驗。有幾百個從kernel32導出的不正確的守護函數。詳細信息:http://www.kndr.org/windows-sdk-brokenness – 2011-01-22 21:22:07