2010-08-31 24 views
15

मैक्रो के रूप में परिभाषित किया गया है:MAKEINTRESOURCE() क्यों काम करता है?

#define MAKEINTRESOURCEA(i) ((LPSTR)((ULONG_PTR)((WORD)(i)))) 
#define MAKEINTRESOURCEW(i) ((LPWSTR)((ULONG_PTR)((WORD)(i)))) 

यह कैसे या तो एक संसाधन आईडी (एक 16-बिट अहस्ताक्षरित int) या उसके नाम (चार की एक सरणी के लिए सूचक) इंगित करने के लिए इस्तेमाल किया जा सकता हो? क्या यह प्रभावी रूप से पता स्थान (32-बिट सिस्टम पर) को 16-बिट तक सीमित नहीं करता है? अन्यथा सिस्टम कैसे जानता है कि मैं एक आईडी या नाम का उपयोग कर रहा हूं?

+2

ये मैक्रोज़ हमेशा मुझे भ्रमित करते हैं। उन्होंने केवल दो अलग-अलग कार्यों को लागू क्यों नहीं किया, जो एक पूर्णांक आईडी लेता है और एक स्ट्रिंग लेता है ... – dreamlax

+0

धन्यवाद यह वास्तव में मैं क्या देख रहा था। –

+0

@dreamlax: ऐसा नहीं कर रहा है जो वास्तव में पहली बार बनाई गई समस्याओं में से एक हल करता है;) डीएलएल में सभी डेटा और फ़ंक्शंस को एक ordinal असाइन किया जाता है, और यदि आप चाहें तो नाम के स्थान पर ऑर्डिनल का उपयोग किया जा सकता है। यह डीएलएल में 65 के लिए उपयोग करने योग्य ordinals की संख्या पर निर्भर करता है (विडंबना यह है कि, इस मैक्रो के अस्तित्व के लिए और यह 'GetProcAddress'' के साथ कैसे इंटरैक्ट करता है)। यदि आप कार्यों के कई संस्करणों के साथ डीएलएल संस्करणों के बीच एबीआई संगतता को बनाए रखना चाहते हैं, तो प्रत्येक अद्वितीय ordinals के साथ, कम कार्यों को आप बेहतर चीजों को छेड़छाड़ कर रहे हैं। –

उत्तर

18

यह काम करता है क्योंकि विंडोज पता स्थान के पहले 64 KB के लिए मैपिंग पृष्ठों की अनुमति नहीं देता है। शून्य सूचक संदर्भों को पकड़ने के लिए। लेकिन मुझे लगता है कि विंडोज़ के 16-बिट संस्करण से परिवर्तित कार्यक्रमों में पॉइंटर बग भी पकड़ना है।

एक दुष्प्रभाव यह है कि यह विश्वसनीय सूचकांक को पॉइंटर मान में पैक करने की इजाजत देता है क्योंकि वे हमेशा गैर-मैप्पेबल मेमोरी को इंगित करेंगे।

+0

+1 का एक अच्छा उत्तर है। यह निश्चित रूप से पॉइंटर्स पर उस प्रतिबंध के लिए एक व्यावहारिक कारण की तरह लगता है। – RBerteig

4

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

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

+0

आपके उत्तर के लिए धन्यवाद। लेकिन मुझे समझ में नहीं आता कि यह केवल 64 केबी क्यों लिया। एक रिसोर्स आईडी 16-बिट इंटरजर होता है, और एक पॉइंटर 32-बिट लंबा होता है। क्या यह 16-बिट लंबे समय तक पॉइंटर की एड्रेसेबल स्पेस को कम नहीं करेगा? – user418680

+1

यदि मान 64 केबी से कम है, तो यह एक पूर्णांक आईडी माना जाता है। यदि यह 64 केबी से अधिक है (सभी तरह से 4 जीबी तक), तो यह एक सूचक माना जाता है। –

+0

याद रखें, आप इस मैक्रो के माध्यम से एक स्ट्रिंग संसाधन नाम पास नहीं करते हैं, केवल एक पूर्णांक संसाधन आईडी। यह पूर्णांक संसाधन आईडी को 16-बिट्स तक सीमित करता है, लेकिन आईआईआरसी वे पहले ही द्विआधारी संसाधन प्रारूप से ही थे। – RBerteig

13

MAKEINTRESOURCE मैक्रो सिर्फ संख्यात्मक पैरामीटर और स्ट्रिंग पॉइंटर के बीच कास्टिंग करता है। परिणामी स्ट्रिंग पॉइंटर अमान्य है और इसे संसाधन नाम के रूप में संदर्भित नहीं किया जा सकता है। हालांकि, संसाधन हैंडलिंग एपीआई ऐसे पॉइंटर्स को उनके पूर्ण मूल्य से पहचानता है और उन्हें संसाधन आईडी के रूप में व्यवहार करता है, न कि संसाधन का नाम। चूंकि सी शैली API अधिक भार का समर्थन नहीं करता, वे की तरह दो कार्यों को परिभाषित नहीं कर सकते हैं:

 
HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName); 
HICON LoadIcon(HINSTANCE hInstance,UINT resourceId); 

तो, API डेवलपर को दोनों ही मामलों के लिए एक ही समारोह का उपयोग करने के, API उपयोगकर्ताओं के लिए MAKEINTRESOURCE मैक्रो प्रदान करने का निर्णय लिया। मेरा मानना ​​है कि दो अलग-अलग कार्यों बेहतर दिखाई दे सकता है कि:

 
HICON LoadIconByName(HINSTANCE hInstance,LPCTSTR lpIconName); 
HICON LoadIconById(HINSTANCE hInstance,UINT resourceId); 

लेकिन इस तरह से Windows API कार्यान्वित किया जाता है नहीं है। मान्य संसाधन आईडी हमेशा न्यूनतम संभव सूचक मूल्य से कम है। संसाधन नाम पैरामीटर इस मैक्रो के बिना एपीआई को पास किया जाता है, और इसका मान प्रतिबंधित नहीं है।

+0

यह इतिहास के लिए –

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