2011-01-22 6 views
8

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 परिभाषित किया गया है।

+1

मैं एमएसडीएन का उपयोग करता हूं। मैं लिंक प्रदान करता हूं, लेकिन मुझे लगता है कि आपके पास पहले से ही है। विशेष रूप से, "आवश्यकताएं" अनुभाग, जहां यह "न्यूनतम समर्थित क्लाइंट" और "न्यूनतम समर्थित सर्वर" देता है। ब्याज के भी: [WINVER, _WIN32_WINNT, _WIN32_WINDOWS, और _WIN32_IE के बीच क्या अंतर है?] (Http://blogs.msdn.com/b/oldnewthing/archive/2007/04/11/2079137.aspx)। –

उत्तर

7

यह एक बग है। संदर्भ उदाहरण are here और here। कुछ माध्यमिक साक्ष्य कि लॉन्गहोर्न परियोजना वास्तव में एक बहुत परेशान थी। विंडोज टीम देवडिव की प्रतिक्रिया नहीं लेती है, बग तय करने में मुश्किल होती है। आप एमएसडीएन लाइब्रेरी पेज के नीचे एक एनोटेशन छोड़ सकते हैं।

+3

तो मैंने थोड़ा प्रयोग करने का फैसला किया। कर्नेल 32 से निर्यात किए गए गलत तरीके से संरक्षित कार्यों के * सैकड़ों * हैं। विवरण: http://www.kndr.org/windows-sdk-brokenness –

+0

यह समस्या न केवल 'kernel32.dll' से आयातित फ़ंक्शंस पर लागू होती है, लेकिन मैंने इसे' advapi32 'से 'Perf *' विधियों पर भी पाया। dll'। – nothrow

संबंधित मुद्दे