2011-12-07 12 views
9

मुझे पता है कि जब मैं डेल्फी एपीपी और डेल्फी डीएलएल के बीच strings साझा करता हूं तो मुझे ऐप और डीएलएल प्रोजेक्ट स्रोत दोनों में Sharemem को उपयोग खंड में पहली इकाई के रूप में जोड़ने की आवश्यकता है।डेल्फी का शेयरमेम - जब इसकी आवश्यकता नहीं है

लेकिन, यदि डीएल निर्यात कार्य करता है जो केवल Pchars स्वीकार करता है लेकिन कुछ डीएल तरीकों के अंदर मैं strings का उपयोग करता हूं, तो क्या मुझे शेयरमेम का भी उपयोग करना चाहिए? मुझे एक नमूना कोड से पता चला है:

procedure ShowMyCustomMessage(aMessage : Pchar); 
var 
    vUselessString : string; 
begin 
    vUselessString := aMessage; 
    ShowMessage(vUselessString); 
end; 

exports 
    ShowMyCustomMessage; 

कि सरल और बेकार मामले में, dll एक Pchar स्वीकार कर रहा है लेकिन निर्यात विधि के अंदर dll एक string वर पैदा करता है। क्या मुझे ShareMem भी जोड़ना चाहिए?

WideString के बारे में क्या? WideString पैरामीटर पास करने से Sharemem का उपयोग करने की आवश्यकता है?

+2

AFAIK 'ShareMem' का उपयोग किया जाना है यदि आप बहिष्कृत borlndmm.dll मेमोरी मैनेजर का उपयोग करना चाहते हैं। लेकिन डेल्फी 2007 के बाद से यह एक अच्छा विचार नहीं है। आप बेहतरShareShareMem का उपयोग करेंगे जो FastMM4 पर आधारित है और * बहुत * तेज़ है। –

+0

@ अर्नुड क्या आप निश्चित हैं कि बोर्नलम को बहिष्कृत किया जा रहा है? मैंने किसी के बारे में बात नहीं देखी है। –

+0

@RafaelColucci: * पुराना * borlndmm.dll। उलझन में, सभी मेमोरी मैनेजर डीएलएल के पास यह नाम है। डेल्फी/सी ++ बिल्डर का वर्तमान संस्करण फास्टएमएम का उपयोग करता है, जिसे 'borlndmm.dll' में संकलित किया गया है, और अब कई सालों से है। –

उत्तर

17

आपको Sharemem का उपयोग करने की आवश्यकता है अगर केवल एक मॉड्यूल (यानी डीएलएल/EXE) में स्मृति आवंटित की जाती है और एक अलग मॉड्यूल में हटा दी जाती है। यह आमतौर पर तब होता है जब आप मॉड्यूल के बीच string पास कर रहे हैं।

उदाहरण में आप Sharemem का उपयोग करने की आवश्यकता नहीं है। PChar के लिए स्मृति को कॉल द्वारा आवंटित किया जाता है और कैली द्वारा अस्वीकृत नहीं किया जाता है। कैली में स्ट्रिंग आवंटित और कैली में deallocated है।

function GetString: string; 
begin 
    Result := 'hello'; 
end; 

यहाँ स्ट्रिंग के लिए स्मृति कॉल प्राप्त करने वाला में आवंटित किया जाता है लेकिन कॉल करने वाले को पुनः आवंटित की जाती किया जाएगा:

यहाँ एक उदाहरण है जहाँ आप Sharemem की आवश्यकता होगी है।

WideString का मामला काफी खास है। WideString COM BSTR प्रकार के चारों ओर एक रैपर है। यह साझा COM आवंटक का उपयोग करके आवंटित और हटा देता है। तो यह डेल्फी आवंटक का उपयोग नहीं करता है और आप Sharemem का उपयोग किए बिना मॉड्यूल के बीच WideString पास करने के लिए सुरक्षित हैं।

+0

जानना अच्छा है, लेकिन क्या होगा यदि Pchar की बजाय डीएलएल एक चौराहे को स्वीकार करता है? –

+0

उत्तर अद्यतन किया गया। आपके प्रश्न में वाइडस्ट्रिंग का जिक्र नहीं किया गया! –

+0

मुझे पता है, यह सिर्फ एक प्लस था। सबके लिए धन्यवाद। –

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