2010-12-14 21 views
6

यह डेल्फी में किए गए कस्टम नेमस्पेसर हैंडलर से है जो मैं वेबब्रोसर घटक में फ़ाइलों को लोड करने के लिए उपयोग करता हूं।कोड के इस बिट में टोलस्ट्रीम को कैसे मुक्त करें

 

Datastream:IStream; 

var 
    F: TFileStream; 
    Dummy: INT64; 
begin 

    F:=TFileStream.Create(strfilename fmOpenRead); 
    CreateStreamOnHGlobal(0, True, DataStream); 
    TOleStream.Create(DataStream).CopyFrom(F, F.Size); 
    DataStream.Seek(0, STREAM_SEEK_SET, Dummy); 
    TotalSize := F.Size; 
    F.Free; 
end; 

समस्या है जब कार्यक्रम समाप्त हो जाती है और कहता है कि TOleStream मुक्त नहीं किया गया था कि Fastmm4 एक स्मृति रिसाव त्रुटि देता है। मैं इसे कैसे मुक्त करूं? अगर मैं एक चर में TOleStream रख दिया और इस

 
var 
TOS:TOleStream; 

TOS:=TOleStream.Create(DataStream) 
TOS.CopyFrom(F, F.Size); 

.. 
TOS.Free; 
End; 

की तरह आवंटित मैं टीओएस चर मुक्त कर जब मैं एक अंत में त्रुटि (EAccessViolation ComObj में TComObject.ObjRelease की ओर इशारा करते) मिलता है। मैं आपकी टिप्पणियों और सहायता की सराहना करता हूं। यह समस्या मुझे थोड़ी देर के लिए परेशान कर रही है।

मैं यह भी सोच रहा हूं कि यह FastMM4 के साथ कुछ हो सकता है? क्या यह झूठी सूचना दे सकता है? निम्नलिखित कोड जैसे कुछ कोड में। आमतौर पर TOLEStream कैसे मुक्त किया जाता है?

 
f.SaveToStream(TOleStream.Create(DataStream)); 

और क्या TFileStream का उपयोग किए बिना डेटास्ट्रीम को डेटा भेजने का कोई तरीका है?

हाय रेमी, आप fastmm और समस्या प्रक्रिया यहाँ के साथ नाम स्थान हैंडलर की एक काम डेमो परियोजना पा सकते हैं: http://mode5.webs.com/namespace.7z जब इस परियोजना लोड, नाम स्थान हैंडलर फ़ाइलें लोड करने के लिए बटन क्लिक करें। जब आप बाहर निकलते हैं, तो आपको फास्टम त्रुटि मिलनी चाहिए। सधन्यवाद,

+2

हाय, मोड, StackOverflow में आपका स्वागत है। यह एक बहुत अच्छा सवाल है, लेकिन अगर हम जानते हैं कि आपको मुफ्त में क्या त्रुटि मिलती है तो इससे मदद मिलेगी। क्या आप अपना प्रश्न संपादित कर सकते हैं और उस त्रुटि की प्रतिलिपि बना सकते हैं जो आप यहां हमारे लिए प्राप्त करते हैं? धन्यवाद। –

+0

फास्टएमएम गलत नहीं है। आप वास्तव में क्या करने की कोशिश कर रहे हैं? एक फ़ाइल को एक आईएसट्रीम में लोड करें और इसके साथ कुछ करें? क्या फ़ाइल को संशोधित किया जाना चाहिए या क्या आप इसे पढ़ना चाहते हैं? –

उत्तर

3

आप कुछ करने के लिए एक IStream इंटरफ़ेस पारित करने के लिए की जरूरत है, तो आप TStreamAdapter वस्तु में दिखना चाहिए, आप, TFileStream पर एक बना सकते हैं और इसके IStream इंटरफ़ेस गुजरती हैं।

+0

धन्यवाद Stijn, मैं कोशिश कर रहा हूँ कि – Mode

+0

धन्यवाद Stijn, क्या आप थोड़ा सा विस्तार कर सकते हैं? जब मैं डेटास्ट्रीम का उपयोग करने का प्रयास करता हूं: = TStreamadapter.create (f, soOwned); Fastmm4 एक त्रुटि फेंकता है कि मैं एक मुक्त वस्तु के एक इंटरफेस का उपयोग करने की कोशिश कर रहा हूँ। कुछ डेमो कोड सहायक होंगे। एक बार फिर धन्यवाद। – Mode

+0

मुझे यकीन नहीं है कि मैं समझता हूं कि आपके द्वारा क्या मतलब है "डेल्फी में किए गए कस्टम नेमस्पेसर हैंडलर मैं वेबब्रोसर घटक में फ़ाइलों को लोड करने के लिए उपयोग करता हूं" मुझे नहीं लगता कि कस्टम नेमस्पेस हैंडर वेबब्रोसर सामग्री लोड करने का सबसे अच्छा तरीका है। IInternetProtocol है, लेकिन यह स्वयं को लागू करने के लिए बहुत सारे काम है, मुझे पता है क्योंकि मैंने यहां कोशिश की: http://xxm.sf.net/ –