Using the Windows Headers में, माइक्रोसॉफ्ट का दावा है कि _WIN32_WINNT और NTDDI_VERSION का उपयोग विंडोज के नए संस्करणों के लिए परिभाषित एपीआई कार्यों को रोकने के लिए किया जा सकता है। हालांकि, यह सार्वभौमिक रूप से सच प्रतीत नहीं होता है।windows.h में WINVER और _WIN32_WINNT गार्ड के साथ क्या हुआ?
उदाहरण के लिए, CancelSynchronousIo को Vista या बाद में आवश्यकता है, लेकिन विंडोज़ एसडीके के दो संस्करणों में यह बिल्कुल भी संरक्षित नहीं है (v6.0 और v7.1)।
#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 */
बात सिर्फ एक बग की इस तरह है:
WINBASEAPI
BOOL
WINAPI
CancelIoEx(
__in HANDLE hFile,
__in_opt LPOVERLAPPED lpOverlapped
);
इस बीच, GetVolumeInformationByHandleW है, जो भी विस्टा की आवश्यकता है, जैसा कि आप उम्मीद कर सकते हैं सुरक्षित है? _WIN32_WINT गार्ड बेकार हैं? क्या कोई यह निर्धारित करने के लिए एक विश्वसनीय तरीका सुझा सकता है कि विंडोज के किस संस्करण ने एपीआई कार्यों को पेश किया? जोड़ने के लिए
संपादित:
यहाँ एक परीक्षण है। foo.h शामिल हैं:
#include <windows.h>
तब चलाएँ:
cl /E /D_WIN32_WINNT=0x0501 /DNTDDI_VERSION=0x05010000 foo.h | grep CancelSynchronousIo
मेरे उम्मीद है कि मेरे पास कोई आउटपुट प्राप्त होता है, लेकिन इसके बजाय CancelSynchronousIo परिभाषित किया गया है।
मैं एमएसडीएन का उपयोग करता हूं। मैं लिंक प्रदान करता हूं, लेकिन मुझे लगता है कि आपके पास पहले से ही है। विशेष रूप से, "आवश्यकताएं" अनुभाग, जहां यह "न्यूनतम समर्थित क्लाइंट" और "न्यूनतम समर्थित सर्वर" देता है। ब्याज के भी: [WINVER, _WIN32_WINNT, _WIN32_WINDOWS, और _WIN32_IE के बीच क्या अंतर है?] (Http://blogs.msdn.com/b/oldnewthing/archive/2007/04/11/2079137.aspx)। –