2008-10-09 17 views
7

में cbSize सदस्य का उद्देश्य क्या है I Win32API संरचनाओं के लिए अक्सर कुछ परिभाषाओं का सामना करना पड़ता है (लेकिन इस तक सीमित नहीं है) जिसमें निम्नलिखित उदाहरण में cbSize सदस्य है।Win32API structs

typedef struct _TEST { 
    int cbSize; 
    // other members follow 
} TEST, *PTEST; 

और फिर हम इसे इस तरह का उपयोग करें:

TEST t = { sizeof(TEST) }; 
... 

या

TEST t; 
t.cbSize = sizeof(TEST); 
... 

मेरे प्रारंभिक अनुमान है कि इस संभावित वर्ज़निंग के लिए इस्तेमाल किया जा सकता है। एक डीएलएल जो इस तरह की संरचना के लिए सूचक प्राप्त करता है, यह जांच सकता है कि cbSize सदस्य के पास अपेक्षित मूल्य है जिसके साथ डीएलएल संकलित किया गया था। या यह जांचने के लिए कि संरचना के लिए उचित पैकिंग किया गया है या नहीं। लेकिन मैं आपसे यहां से चाहूंगा।

Win32API पर कुछ सी ++ संरचनाओं में cbSize सदस्य का उद्देश्य क्या है?

उत्तर

10

मेरे प्रारंभिक अनुमान है कि इस संभावित वर्ज़निंग के लिए इस्तेमाल किया जा सकता है।

यही कारण है। मुझे लगता है कि यह अधिक सामान्य है।

दूसरा संरचनाओं के लिए है जिसमें परिवर्तनीय लंबाई डेटा है।

मुझे नहीं लगता कि कॉलर में सही पैकिंग या बग की जांच करना इसके पीछे एक विशेष तर्क है, लेकिन इसका असर होगा।

0

आंशिक रूप से वर्ज़निंग, ज्यादातर सुरक्षा ... याद है कि struct में पारित का हिस्सा नहीं था में poking से बुलाया समारोह को रोकने के लिए।

11

यह वर्ज़निंग के लिए प्रयोग किया जाता है। एक अच्छा उदाहरण GetVersionEx कॉल है। आप या तो OSVERSIONINFO या OSVERSIONINFOEX में पास कर सकते हैं। OSVERSIONINFOEX OSVERSIONINFO का एक सुपरसेट है, और ओएस जानता है कि ओएस को पता है कि आपने जो पास किया है वह dwOSVersionInfoSize सदस्य द्वारा है।

+1

स्टुक्स ओएस संस्करणों के बीच आकार में भिन्नता है। मैंने बस वीसी ++ 2008 के साथ आने वाले प्लेटफॉर्म एसडीके का उपयोग करके एक बग मारा। हम ओएस संस्करण को सही ढंग से परिभाषित नहीं कर रहे थे और एक स्ट्रक्चर के Vista संस्करण का उपयोग करके समाप्त हो गए थे - जो मेरे एक्सपी बॉक्स पर इतना अच्छा काम नहीं कर रहा था। – Aardvark

2

यह भी Win32 एपीआई विवेक डेटा की जाँच कर का एक न्यूनतम राशि करने की सुविधा देता में पारित किया जा रहा।

उदाहरण के लिए एक commom गलती गलत एक साथ पास होने के लिए एक WIN32 संरचना के लिए है या cbSize uninitialisedऔर जब यह Win32 एपीआई होता है आम तौर पर सिर्फ एक असफल परिणाम देता है, बजाय क्या डेटा दूषित प्रतीत कार्रवाई करने के लिए प्रयास करें।

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