2008-11-11 10 views
10

का कारण क्या हो सकता है मेरे पास vb6 में एक COM dll लिखा गया है। जब मैं इस डीएलएल से कक्षा मॉड्यूल का एक नया ऑब्जेक्ट बनाने की कोशिश करता हूं तो मुझे रन टाइमर त्रुटि 430 मिलती है: कक्षा स्वचालन का समर्थन नहीं करती है या अपेक्षित इंटरफ़ेस का समर्थन नहीं करती है। दिलचस्प बात यह है कि यह केवल आईडीई के बाहर से होता है, जब मैं आईडीई के भीतर से डीबगिंग कर रहा हूं तो कोई त्रुटि नहीं फेंक दी जाती है और कक्षा की नई वस्तु सफलतापूर्वक बनाई जाती है। कारण क्या हो सकता है?वीबी 6 रन टाइम त्रुटि 430

आम तौर पर मुझे कभी-कभी COM dlls में इस प्रकार की त्रुटियां मिलती हैं। COM मुद्दों को डीबग करने का सबसे अच्छा तरीका क्या है? मैं प्रोग्राम के चलते उपयोग किए जा रहे डीएलएल के पथ को कैसे जान सकता हूं?

उत्तर

9

यदि यह परियोजना पूरी तरह से वीबी 6 में है। इसका संभावित कारण यह है कि EXE की निर्देशिका में डीएलएल बाइनरी की एक प्रति है। जब आप आग लगते हैं तो यह संकलित प्रतिलिपि के बजाय उस प्रति का उपयोग करता है। जब आप विधियों या कक्षाओं को जोड़ते हैं जो EXE पुराने DLL के साथ असंगत हो जाता है। यदि आपने एक बग फिक्स किया है या सिर्फ अंदर कोड के साथ काम किया है तो EXE चलाएगा लेकिन यह पुराने DLL का उपयोग करता है।

अपने डीएलएल को बाइनरी संगतता में सेट करें। सुनिश्चित करें कि आपके पास एक संगत निर्देशिका है। वहां पर अंतिम संस्करण का डीएलएल रखें। उस डीएलएल को बाइनरी संगतता को इंगित करें। सुनिश्चित करें कि आपका EXE इसकी प्रोजेक्ट निर्देशिका में संकलित है। अपने प्रोजेक्ट निर्देशिका से EXE चलाएं। इस तरह यह आपके द्वारा संकलित डीएलएल का उपयोग करेगा। आपको एक उपयोगिता लिखनी है ताकि आप प्रत्येक परियोजना को अलग से संकलित कर सकें। वर्चुअल पीसी या किसी अन्य कंप्यूटर का उपयोग करके अपने सेटअप का परीक्षण करें।

ये सभी कदम डीएलएल नरक से बचने में मदद करेंगे। मेरी खुद की परियोजना में 6 परतों में दो दर्जन ActiveX प्रोजेक्ट हैं। जब मैंने ऊपर अपनाया था तो मेरी डीएलएल नरक की समस्याएं लगभग कुछ भी नहीं गिर गईं।

2

यह लगभग निश्चित रूप से एक संस्करण समस्या है, जिसे कभी-कभी "डीएलएल नरक" भी कहा जाता है।

पृष्ठभूमि यह है कि .NET दुनिया स्पष्ट रूप से समान नाम रखने के दौरान इंटरफेस विकसित करने के लिए डिज़ाइन की गई है। लेकिन COM दुनिया में, इंटरफेस को अपरिवर्तनीय माना जाता है।

जब आप आईडीई के भीतर काम कर रहे हों, तो विजुअल स्टूडियो हर बार जब आप अपना समाधान चलाते हैं तो COM dll के लिए एक नया COM इंटरऑप रैपर बना रहा है। लेकिन जब तक आप एक नए-नए COM इंटरऑप रैपर समेत अपने पूरे समाधान को रिलीज़ और प्रतिस्थापित नहीं करते हैं, तो आप एक संस्करण समस्या में भागने जा रहे हैं, जहां .NET कोड एक COM इंटरफ़ेस की अपेक्षा कर रहा है लेकिन एक अलग दिख रहा है।

EDIT: किसी कारण से, मुझे लगता है कि आप .NET घटक से COM घटक का उपयोग करने का प्रयास कर रहे हैं। यदि पूरा समाधान वास्तव में वीबी 6 है, तो श्री कॉनली का समाधान अनुशंसित दृष्टिकोण है। Here's a good link जो समस्या पर चर्चा करता है।

4

बाइनरी बनाम प्रोजेक्ट को संगत रूप से पढ़ें।

यदि आपके पास साझा डीएल है तो आपको सावधान रहना होगा और बाइनरी को संगत रूप से उपयोग करना होगा। इस तरह वीबी 6 बिल्ड के बीच एक ही COM हस्ताक्षर/इंटरफेस रखेगा। तुलना करने के लिए आपके पास वीबी 6 के लिए जारी डीएलएल की एक प्रति है - मेरे पास आमतौर पर जारी बाइनरी के लिए एक अलग फ़ोल्डर होता है। बाइनरी संगतता के साथ प्रतिबंध यह है कि आप सार्वजनिक गुणों या विधियों को हटा नहीं सकते हैं और आप उनके हस्ताक्षर नहीं बदल सकते हैं। आप नई गुण और विधियां जोड़ सकते हैं।

यदि आपको ब्रेकिंग परिवर्तन करना है (पुराने सार्वजनिक तरीकों को हटाने की तरह) तो परियोजना संगतता का उपयोग करें - हालांकि यदि आप ऐसा करते हैं तो आपको साझा डीएलएल का उपयोग करने वाले सभी अन्य ऐप्स को फिर से संकलित करना होगा।