2011-12-10 17 views
5

से BASE_OFFSET मैक्रो मैं आवश्यक COM पढ़ रहा हूं और पुस्तक के अध्याय 2 से एक मैक्रो 'BASE_OFFSET' का सामना कर रहा हूं और मैं वास्तव में इसके वाक्यविन्यास को समझ नहीं पा रहा हूं या ऐसा क्यों किया जाता है।आवश्यक COM

#define BASE_OFFSET(ClassName, BaseName) \ 
(DWORD_PTR(static_cast<BaseName*>(reinterpret_cast<ClassName*>(0x10000000))) - 0x10000000) 

क्या कोई इस मैक्रो को समझा सकता है और हम इसका उपयोग कैसे कर सकते हैं? वास्तव में, पुस्तक इस मैक्रो का उपयोग करती है लेकिन चूंकि मैं इसे वास्तव में समझ नहीं पा रहा हूं, इसलिए मुझे इसका व्यावहारिक उपयोग नहीं दिख रहा है। पहले से ही बहुत - बहुत धन्यवाद।

+0

मेरे प्रश्न को संपादित करने के लिए धन्यवाद। – istudy0

+1

वैसे एक और मानक विंडोज मैक्रो [FIELD_OFFSET] (http://msdn.microsoft.com/en-us/library/windows/hardware/ff545727 (v = vs.85) .aspx) आपको नामित फ़ील्ड का ऑफसेट मिलता है संरचना का। आपकी टिप्पणी के लिए – Oleg

+0

धन्यवाद। – istudy0

उत्तर

7

मैक्रो reinterpret_cast साथ ClassName को एक डमी सूचक का निर्माण करता है और उसके बाद static_cast साथ BaseName करने के लिए इसे डाले।

एकाधिक विरासत की उपस्थिति में, बेस क्लास सबोबजेक्ट का पता हमेशा ऑब्जेक्ट के पते के समान नहीं होता है। ClassName ऑब्जेक्ट में BaseName सबोबजेक्ट के ऑफसेट को प्राप्त करने के लिए, संभवतः अलग-अलग पते को मूल डमी पते से घटाया गया है। यह offsetof के समान है, लेकिन सदस्यों के बजाय बेस क्लास सबोबजेक्ट्स के लिए है।

Diagram showing an example

इससे आपका कुछ बुरा निम्न स्तर के सामान कर रहे हैं ही उपयोगी है।

+0

आपकी व्याख्या के लिए बहुत बहुत धन्यवाद। आपका चित्र मुझे यह देखने में मदद करता है कि क्या हो रहा है। – istudy0

+0

+1, यहां भी एक जैसी बात है: http://stackoverflow.com/q/5014061/57428 – sharptooth

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