2012-02-04 22 views
12

में अनुपलब्ध घटक त्रुटि प्राप्त करना मेरे पास एक वीबी 6 ऐप है जिसमें तीसरे पक्ष के घटक हैं। एप्लिकेशन अच्छी तरह से काम करता है, लेकिन बाहर निकलने पर (और केवल जब एक स्टैंडअलोन EXE, जैसे आईडीई में नहीं के रूप में चल), यह पॉप अप होता है एक त्रुटि संदेश:वीबी 6 एप्लिकेशन

enter image description here

मैं इस तरह की त्रुटियों को देखा है से पहले, लेकिन आम तौर पर यह कहता है कि कौन सा घटक निर्भरता खो रहा है या ठीक से पंजीकृत नहीं है।

मैं इसे माध्यम से प्रक्रिया की निगरानी भाग गया और निम्न फ़ाइलें है कि यह नहीं मिल सकता है मिल गया:

enter image description here

और फिर यह इस्तीफा। मैंने फ़ाइल नामों को गुगल किया है जो इसे नहीं ढूंढ पा रहे हैं और कुछ भी नहीं ढूंढ सकते हैं। ऐसा लगता है कि यह MSComENU, MSComEN और MSCOENU dlls की विविधता की खोज करता है।

मैं जाँच की और सुनिश्चित करें कि सभी 3 पार्टी घटकों देखते हैं और वे कर रहे हैं बनाने के लिए फिर से जांचा - आवेदन कार्यों ठीक है, यह नहीं तो वे वहाँ नहीं थे होगा।

यह ध्यान देने योग्य है कि वीबी 6 कोड की अंतिम पंक्ति के बाद त्रुटि होती है (Form_Unload ईवेंट में) निकाल दिया गया है। मुझे यह पता है क्योंकि आखिरी पंक्ति एक संदेश बॉक्स है जो प्रकट होता है।

अधिकतर बाद में EDIT: मैं अंततः समस्या से निपटने के लिए वापस आ गया और उन्मूलन की प्रक्रिया के द्वारा इसे समझ लिया (और यह एक लूंग प्रक्रिया थी)। अंत में किसी भी एमएससीओएमएम *। डीएल प्रविष्टियों के साथ इसका कोई लेना-देना नहीं था। वास्तव में, मुझे नहीं पता कि वे अभी भी प्रक्रिया मॉनीटर में क्यों दिखते हैं। समस्या बहुत आसान थी।

मैं मुख्य रूप पर कई 3 पार्टी नियंत्रण था। ईवेंट प्रबंधन कोड की एक टन के साथ मुख्य रूप अपवित्र करने के लिए नहीं के प्रयास में, मैं एक नया वर्ग के लिए इन नियंत्रणों प्रत्यायोजित, इसलिए जैसे:

' declaration code in main form' 
Private WithEvents moDelegateObject as clsDelegateObject 

' still in the main form, after initialization' 
Set moDelegateObject = new clsDelegateObject 
With moDelegateObject 
    Set .ThirdPartyCtlHandler1 = me.ThirdPartyCtl1 
    Set .ThirdPartyCtlHandler2 = me.ThirdPartyCtl2 
    Set .ThirdPartyCtlHandler3 = me.ThirdPartyCtl3 
end with 

' declarations and properties inside of clsDelegateObject' 
Private WithEvents moThirdPartyCtlHandler1 as ThirdPartyCtl 
Private WithEvents moThirdPartyCtlHandler2 as ThirdPartyCtl 
Private WithEvents moThirdPartyCtlHandler3 as ThirdPartyCtl 
Public Event FooEvent() ' other various events as well ' 

Public Property Set ThirdPartyCtlHandler1(o as ThirdPartyCtl) 
    moThirdPartyCtlHandler1 = o 
End Property 
Public Property Get ThirdPartyCtlHandler1() as ThirdPartyCtl 
    ThirdPartyCtlHandler1 = moThirdPartyCtlHandler1 
End Property 
' ... Repeat for each handler ...' 

क्या याद आ रही थी स्पष्ट रूप से बंद करने से पहले इन वस्तुओं पुनःआवंटन करने के लिए कोड था। यह ऐसा कुछ है जो विजुअल बेसिक आमतौर पर करता है। इसलिए मैं मुख्य रूप में Form_QueryClose में निम्नलिखित कहा:

With moDelegateObject 
    Set .ThirdPartyCtlHandler1 = Nothing 
    Set .ThirdPartyCtlHandler2 = Nothing 
    Set .ThirdPartyCtlHandler3 = Nothing 
End with 
Set moDelegateObject = Nothing 

अंतिम लाइन निकला superflous होने के लिए, लेकिन मैं पूर्णता के लिए वहाँ में फेंक दिया। मुझे लगता है कि यह एक प्रतिनिधि वर्ग को नियंत्रण देने और मुख्य रूप में घटनाओं को प्राप्त करने और वास्तव में अस्पष्ट तृतीय पक्ष नियंत्रणों की एक अच्छी संख्या का उपयोग करके इस समस्या में योगदान देने का एक संयोजन था। यह संभव है कि तीसरा पक्ष नियंत्रण स्वयं को साफ-साफ नहीं करता है। वैसे भी, सबक सीखा।

+0

+1। @ नानामी करीबी मतदाता: यह एक अच्छा सवाल है। इन समस्याओं का निदान करना मुश्किल है, विशेषज्ञता साझा करना बहुत उपयोगी है। – MarkJ

+0

क्या यह समस्या एक कंप्यूटर (विकास मशीन?) के लिए विशिष्ट है, या यह अन्य कंप्यूटरों पर दोहराने योग्य है? क्या यह अभी एक ऐप में हो रहा है जो पहले ठीक काम कर रहा है? – MarkJ

+0

के रूप में अगर MSComm32.dll अमेरिका अंग्रेजी स्थान के लिए त्रुटि संदेश संसाधन DLL लोड करने का प्रयास एक अमेरिकी अंग्रेजी मशीन/उपयोगकर्ता के सत्र पर चल रहा है की एक विदेशी भाषा के संस्करण में कुछ त्रुटि हुई (या सिर्फ एक libload विफलता) मेरे लिए लग रहा है। – Bob77

उत्तर

2

यह एक DLL_PROCESS_DETACH या CoUninitialize समस्या हो सकती है।

जैसा कि आपने कहा ये हैं: रेमंड चेन के ब्लॉग "ओल्ड नई थिंग" प्रासंगिक लेख के एक जोड़े है तीसरे पक्ष के घटक।जब तक आप छोटी गाड़ी घटक को इंगित करने के लिए समस्या गायब नहीं हो जाती तब तक आप छोटे परीक्षण मामलों को बनाने का प्रयास कर सकते हैं। आप देशी कोड डीबगर का भी प्रयास कर सकते हैं और विश्लेषण कर सकते हैं कि किस कोड ने त्रुटि संदेश बनाया है।

सबसे आसान समाधान हालांकि इस मुद्दे के आसपास काम करने के लिए उन सभी घटकों के विशिष्ट लोड-ऑर्डर को मजबूर करने का प्रयास कर रहा है। मुख्य() या स्टार्टअप फॉर्म में, एक निश्चित क्रम में प्रत्येक तृतीय पक्ष घटक की कुछ कार्यक्षमता का उपयोग करने का प्रयास करें। अगर बग अभी भी दिखाई देता है, तो समस्या तब तक बदल जाती है जब तक समस्या गायब न हो जाए। यह काम कर सकता है।

2

आप अगर उन तृतीय पक्ष फ़ाइलों के किसी भी निर्भरता याद कर रहे हैं देखने के लिए प्रोजेक्ट फ़ाइल में संदर्भ की सूची में dependency walker उपयोग करने का प्रयास कर सकता है। यदि कोई निर्भरता गुम नहीं है तो regsvr32 का उपयोग कर फ़ाइलों को फिर से पंजीकृत करने का प्रयास करें। यदि regsvr32 आदेशों में से कोई भी विफल रहता है तो आपको अनुपलब्ध निर्भरताओं के साथ घटक मिल सकता है।

+0

पुनः पंजीकरण करने के पहले पहले (regsvr32/u [घटक]) को पुनः पंजीकृत करने का प्रयास करें, एक घटक पंजीकृत करना। मेरे लिए यह एक बार काम किया। – Simon