2008-08-29 16 views
8

मुझे सरल 64 बिट मेमोरी प्रबंधन करने के लिए सी ++ में डेल्फी संगत डीएल बनाने के लिए कहा गया है।64 बिट मेमोरी आवंटन

पृष्ठभूमि यह है कि डेल्फी में सिस्टम को स्मृति के बहुत सारे हिस्सों को आवंटित करने की आवश्यकता होती है जो 32 बिट एड्रेसेबल स्पेस के बाहर अच्छी तरह से चलती हैं। डेल्फी डेवलपर ने मुझे समझाया कि वह उनके लिए उपलब्ध डेल्फी आदेशों के साथ स्मृति आवंटित नहीं कर सका। वह कहता है कि वह 64 बिट पता रख सकता है, इसलिए वह सिर्फ एक समारोह को कॉल करना चाहता है जो मैं स्मृति आवंटित करने के लिए प्रदान करता हूं और उसे 64 बिट पॉइंटर लौटाता हूं। फिर बाद में स्मृति को मुक्त करने के लिए एक और समारोह।

अब, मेरे पास केवल मेरे निपटारे में वीएस 2008 है इसलिए सबसे पहले मुझे यकीन नहीं है कि मैं पहली जगह में डेल्फी संगत डीएल बना सकता हूं।

कोई भी डेल्फी विशेषज्ञ मेरी मदद करने की देखभाल करते हैं। शायद पहिया को फिर से आविष्कार किए बिना उसे प्राप्त करने के लिए एक तरीका है। अन्य डेवलपर्स डेल्फी में पहले इस पर आ गए होंगे।

सभी टिप्पणियों की सराहना की।

+0

उसे उस मेमोरी ब्लॉक में डेटा पढ़ने/लिखने के लिए फ़ंक्शन की भी आवश्यकता होगी क्योंकि वह 32 बिट प्रक्रिया से ऐसा करने में सक्षम नहीं होगा, और यह एक सादा डीएलएल नहीं हो सकता क्योंकि 32 बिट प्रक्रिया सक्षम नहीं होगी इसे लोड करने के लिए। असल में, यह आपको पुराने समय के ईएमएस/एक्सएमएस मेमोरी "विस्तारक" के समान कुछ लिखने के लिए कहा जाता है ... –

उत्तर

7

केवल 64 बिट प्रक्रिया 64 बिट मेमोरी को संबोधित कर सकती हैं। एक 64 बिट प्रक्रिया केवल 64 बिट डीएलएस लोड कर सकती है और 32 बिट्स प्रक्रिया केवल 32 बिट्स डीएलएस लोड कर सकती है। डेल्फी का कंपाइलर केवल 32 बिट्स बाइनरी बना सकता है।

तो 32 बिट्स डेल्फी एक्सई आपके 64 बिट सी ++ डीएल लोड नहीं कर सकता है। यह 32 बिट सी ++ डीएल लोड कर सकता है, लेकिन फिर वह डीएल 64 बिट मेमोरी स्पेस को संबोधित करने में सक्षम नहीं होगा। आप इस समाधान के साथ फंस गए हैं।

डेल्फी सही कंपाइलर विकल्पों के साथ और विंडोज़ स्विच समस्याओं के बिना 3 जीबी मेमोरी को संबोधित कर सकता है। 32 बिट्स प्रक्रिया द्वारा और भी स्मृति को एक्सेस किया जा सकता है यदि यह Physical Address Extension का उपयोग करता है। इसके बाद Address Windowing Extensions के उपयोग के माध्यम से 32 बिट्स मेमोरी में और बाहर मेमोरी पेजों को स्वैप करने की आवश्यकता है।

+0

इसके अतिरिक्त, 32 बिट प्रक्रिया 64 बिट ओएस में ~ 4 जीबी तक का उपयोग कर सकती है। – samir105

+0

यह अब पूरी तरह सटीक नहीं है। शायद अब आपका जवाब अपडेट करना चाहते हैं कि एम्बरकैडेरो ने 64-बिट कंपाइलर जारी किया है। –

6

डेल्फी पॉइंटर्स 32-बिट हैं। अवधि। आपका डेल्फी डेवलपर उस 64-बिट मानों को 'स्टोर' करने में सक्षम हो सकता है, जिसे आप वापस लौटना चाहते हैं, लेकिन वह उस स्मृति तक नहीं पहुंच सकता है जिसे वे इंगित करते हैं, इसलिए यह बहुत व्यर्थ है।

इससे पहले, मैं लिखा था: -

एक डेल्फी के 64-बिट संस्करण "2009 के बीच के लिए" Codegear/Embarcadero's road map पर है। उत्पाद की गुणवत्ता से अधिक जहाज से टकराने के बिल्कुल तिथियाँ, तो अपनी सांस पकड़ नहीं है (पिछले पर!) हो रहा है पूर्वता ले रही है ...

लेकिन, अगस्त 2010 में, Embarcadero प्रकाशित एक new roadmap here। यह विशिष्ट तिथियां नहीं देता है, लेकिन 64-बिट कंपाइलर पूर्वावलोकन का उल्लेख करता है, प्रोजेक्टेड उपलब्धता, 2011 का पहला आधा

+1

हाल के समाचारों का कहना है कि 64 बिट कंपाइलर अगस्त (http://tech.turbu-rpg.com/351/odd-timing) के आसपास जारी किया जाएगा, जो अब बीटा परीक्षण के तहत है। वास्तव में क्या जारी किया जाएगा अभी भी अज्ञात है। –

+1

इस बार, हालांकि, ऐसा लगता है (डेल्फी x64) हो रहा है। डेल्फी x64 के लिए अब बीटा है: http://www.embarcadero.com/products/delphi/64-bit – PhiS

2

आप 32-बिट मेमोरी पते पर उस 64-बिट पॉइंटर को पिन करने और अनपिन करने का तरीका भी जोड़ना चाहते हैं। चूंकि यह डेल्फी है, मुझे पूरा यकीन है कि यह विंडोज विशिष्ट है, इसलिए आप Address Windowing Extensions का भी उपयोग कर सकते हैं। इस तरह, आप 32-बिट एड्रेस रेंज में आवंटन, मुक्त करने और पिनिंग और स्मृति को अनपिन करने का समर्थन कर सकते हैं और अभी भी 64-बिट मेमोरी आवंटन स्थान का लाभ उठा सकते हैं। यह मानते हुए कि उपयोगकर्ता वास्तव में स्मृति को प्रतिबद्ध करेगा जैसे कि यह 32-बिट वर्चुअल एड्रेस स्पेस में फिट बैठता है।

+0

यदि वह एडब्ल्यूई की जरूरत है तो वह सीधे डेल्फी से एडब्ल्यूई का उपयोग करने में सक्षम होगा। एडब्ल्यूई 32 बिट एड्रेस स्पेस सीमाओं से परे 32 बिट प्रक्रिया को जाने की इजाजत देता है, हालांकि यह 32 बिट एड्रेस स्पेस से मैपिंग/अनैपिंग पेजों को काम करता है, जिससे कुछ एप्लिकेशन इसे उपयोगी पाते हैं, अन्य नहीं। –

5

आप Free Pascal पर एक नज़र डाल सकते हैं क्योंकि इसमें 64 बिट संस्करण शामिल है और अधिकतर डेल्फी संगत वाक्यविन्यास है।

4

एकाधिक प्रक्रिया द्वारा साझा की गई स्मृति आवंटित करने के लिए, आपको मेमोरी मैप की गई फ़ाइल का उपयोग करना चाहिए।

http://www.delphifaq.com/faq/delphi_windows_API/f348.shtml पर उपलब्ध कोड 32 बिट और 64 बिट प्रक्रिया के बीच संवाद करने के लिए उपयोग किया जा सकता है।

ये कदम उठाएँ:

  • एक स्मृति मैप की गई फ़ाइल बनाएँ, या तो डिस्क पर, या तो स्मृति पर;
  • फ़ाइल परिवर्तन को सूचित करने के लिए एक म्यूटेक्स बनाएं;
  • एक अंत मेमोरी मैप किए गए फ़ाइल में कुछ डेटा लिखता है;
  • फिर यह म्यूटेक्स ध्वजांकित करता है;
  • अन्य छोर mutex अधिसूचना प्राप्त करता है;
  • फिर यह मेमोरी मैप की गई फ़ाइल से डेटा पढ़ता है।

किसी भी डेटा को साझा करने के लिए मेमोरी मैप किए गए फ़ाइल में कस्टम बाइनरी लेआउट बनाने के लिए आप पर निर्भर है।

डिज़ाइन द्वारा, मेमोरी मैप की गई फ़ाइलें तेज़ी से होती हैं (यह कर्नेल-स्तर/x86 सीपीयू सुविधा है), और बड़ी मेमोरी (32 बिट प्रक्रिया के लिए 1 जीबी तक, मेरे प्रयोग से) को संभाल सकती है।

32 बिट डेल्फी प्रोग्राम से 64 बिट डीएल कॉल करने के लिए इस प्रकार का संचार http://cc.embarcadero.com/Author/802978 द्वारा उपयोग किया जाता है।

+0

मैं आज "1 जीबी तक" "बड़ी स्मृति" नहीं कहूंगा;) –

+0

@ldsandon यह समझने की बात है। लाइब्रेरी पीओवी से, यह समझ सकता है कि "विशाल" डेटा 64 बिट पक्ष पर रहता है, फिर केवल आवश्यक मानों के डेटा स्थानांतरण के लिए मेमोरी मैप की गई फ़ाइल का उपयोग करें। हर बार जब आप लाइब्रेरी को कॉल करना चाहते हैं तो पूरे डेटा को मैप करने का अर्थ नहीं होगा। एमएम फ़ाइल फ़ंक्शन "पैरामीटर" को संभालने के लिए यहां है। तो इस मामले में, पैरामीटर के लिए 1 जीबी मेमोरी विशाल है। –

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