मैं कैसे सुनिश्चित कर सकता हूं कि इसमें कोई ऑब्जेक्ट मौजूद नहीं है, जबकि कोई ऑब्जेक्ट अनलोड नहीं होता है?सी ++: डीएल अनलोडिंग समस्या
समस्या यह है कि, जब मैं एक्सप्लोर मेमोरी मैनेजमेंट का उपयोग कर रहा था, तो मैं डीएलएल को मुक्त करने से पहले डीएलएल ऑब्जेक्ट्स को हटा सकता था, हालांकि स्मार्ट पॉइंटर्स के साथ मेरे पास नष्ट होने के आदेश पर कोई नियंत्रण नहीं था, जिसका मतलब है कि पहले डीएल को दुर्घटनाग्रस्त कर दिया जा सकता है जब अन्य वस्तुओं में से एक को मुक्त करने की कोशिश कर रहा:
FlPtr यानी केवल सभी वस्तुओं के बाद अनलोड, एक सरल refrence गिनती वर्ग thats AddRef कॉल और आवश्यकतानुसार
ExampleDll *dll = LoadDll(L"bin\\example.dll");
IObject *obj = dll->CreateObject();
...
obj->Release();
delete dll;//fine because all objects already deleted
return 0;
auto_ptr<ExampleDll> dll = LoadDll(L"bin\\example.dll");
FlPtr<IObject> obj = dll->CreateObject();
...
return 0;//crash if dll is destructed before obj since Object::Release needs to call into the dll
मैं dll संभाल itsself उतारने बनाने की कोशिश की रिलीज है हटा दिया गया है। यह एक नया ऑब्जेक्ट IExampleDll बनाकर काम करता है जो डीएल लागू करता है। यह पहले से exampleDll ऑब्जेक्ट की तरह है लेकिन exe के बजाए डीएल में रहता है और यह भी गिना जाता है। डीएल में प्रत्येक ऑब्जेक्ट इस विनाश पर इस प्रतिरक्षा को बढ़ाता है और विनाश पर इसे कम करता है। इसका मतलब है कि रिफ्रेंस गिनती केवल शून्य तक पहुंच जाती है जब एक्सई ने अपने रिफ्रेंस जारी किए हैं और सभी डीएलएस ऑब्जेक्ट्स नष्ट हो गए हैं। इसके बाद यह अपने विनाशक में फ्री लाइब्रेरी (GetModuleHandle()) को बुलाता है।
हालांकि यह FreeLibrary, im asuming पर दुर्घटनाओं क्योंकि धागा DLLs कोड है कि अनलोड में अब भी है ...
अब मैं एक नुकसान में हूँ यकीन है कि dll केवल उतार दिया जाता है जब बनाने के लिए कैसे बाकी सब कुछ हटा दिए जाने के बाद स्पष्ट रूप से डीएल को मुक्त करने के अलावा वापस जाने के अलावा कोई शेष वस्तुएं नहीं हैं;
int main()
{
ExampleDll *dll = LoadDll("bin\\example.dll");
restOfProgram();
delete dll;
}
यह दृष्टिकोण मुश्किल हो जाता है जब DLLs यदि उपयोगकर्ता D3D से बदले गए विकल्प में ओपन करने के लिए saftly लोड करने के लिए/उतार मध्य कार्यक्रम, यानी की जरूरत है।
ठीक है, मुझे एक विचार था, क्या होगा अगर डीएलएस रिलीज() विधि ने एक बूल लौटाया, झूठा अगर कोई शेष रिफ्रेंस नहीं था, तो एक विशेष DllPtr मुफ्त लाइब्रेरी को कॉल कर सकता है अगर रिलीज झूठी –
लौटा दी लेकिन अभी भी आखिरी की समस्या है यदि डीएलपीआरआर पहले हटा दिए जाते हैं तो डीएलएल में रिफ्रेंस हटा दिया जा रहा है ... मैं COM दृष्टिकोण को लागू करने के बारे में कैसे जाउंगा ताकि मैं ढेर और स्थैतिक (यानी ग्लोबल्स) नष्ट होने के बाद डीएलएल को जारी रख सकूं क्योंकि केवल तभी यह स्वयं को गर्वित किया जाता है कोई रेफरी नहीं? –
आपको एक प्रकार की "क्लीनर" ऑब्जेक्ट की आवश्यकता होगी जो डीएल में नहीं है जिसे आप सफलतापूर्वक इस तरह के डीएलएल को अनलोड करने के लिए अनलोड कर रहे हैं, यह लगभग ole32.dll करता है जब CoUnitialize कहा जाता है। – Ismael