2013-02-22 38 views
5

मेरे पास एक एमएफसी एक्सटेंशन डीएलएल है जो एक सी ++ वर्ग निर्यात करता है, और मुझे कक्षा विधि के व्यवहार को संशोधित करने की आवश्यकता है। परिवर्तन कक्षा के तरीकों के हस्ताक्षर को प्रभावित नहीं करते हैं।एमएफसी एक्सटेंशन डीएलएल का पुनर्मूल्यांकन निर्यात किए गए कार्यों के प्रवेश बिंदु

मैं इस पुस्तकालय के पहले रिलीज़ संस्करण की "lib" फ़ाइल का उपयोग करने वाले मॉड्यूल को पुन: संकलित नहीं करना चाहता हूं।

क्या होता है यदि परिवर्तन फ़ंक्शन के प्रवेश बिंदु पते को संशोधित करते हैं?

उदाहरण के लिए, निर्माता का पता बदल गया:

Export Ordinal  Function Hint      Entry Point 
[+ ] 3 (0x0003) 2 (0x0002) [email protected]@[email protected] 0x00009CB0 (OLD DLL) 
[+ ] 3 (0x0003) 2 (0x0002) [email protected]@[email protected] 0x00009760 (NEW DLL) 

मैं मॉड्यूल है कि पुस्तकालय वैसे भी का उपयोग पुन: संयोजित करना चाहिए?

मैंने पुन: संकलित लाइब्रेरी का परीक्षण किया - नए प्रवेश बिंदुओं के साथ - जारी किए गए निष्पादन योग्य का उपयोग करके और सब कुछ ठीक काम करता है। मुझे यकीन नहीं है कि यह परिदृश्य कुछ साइड इफेक्ट्स छुपा रहा है।

डीएलएल को निष्पादन योग्य लिंक करने के लिए कब आवश्यक है?

बाइनरी संगतता कब टूटी जाती है?

उत्तर

2

यह एक डीएलएल का उपयोग करने के लाभों में से एक है - आप इसे बदल सकते हैं, और जब तक आप एक ही फ़ंक्शन हस्ताक्षर रखना जारी रखते हैं, तब तक सब कुछ ठीक काम करेगा। लिंकिंग होता है क्योंकि प्रोग्राम लोड होता है, इसलिए पते में बदलाव से कोई फर्क नहीं पड़ता है।

आप बिल्कुल सकारात्मक होना चाहते हैं कि डीएलएल में परिभाषित किसी भी वर्ग में कोई इनलाइन विधियां नहीं हैं, क्योंकि वे ऑब्जेक्ट में किसी आंतरिक परिवर्तन के साथ काम नहीं कर सकते हैं।

फ़ंक्शन हस्ताक्षर में परिवर्तन होने पर बाइनरी संगतता टूट जाती है, या जब कोई सार्वजनिक सदस्य चर वस्तु के भीतर स्थान बदलता है। मैं एक डीएलएल में सार्वजनिक सदस्य चर से पूरी तरह से बचूंगा।

संपादित करें: टिप्पणियों में उल्लिखित के रूप में, यदि वर्ग को चर से जोड़ दिया जाता है या हटा दिया जाता है तो आप भी परेशानी में पड़ सकते हैं। यह एक समस्या बन जाती है यदि ऑब्जेक्ट DLL के बाहर बनाए जाते हैं, या तो स्थानीय चर के रूप में या new के माध्यम से। आप अपने सभी ऑब्जेक्ट उदाहरणों को डीएलएल के अंदर से और कॉलर को पास करने वाले पॉइंटर्स बनाकर इससे बच सकते हैं। आप अपनी कक्षाओं पर PIMPL idiom का उपयोग करके समस्याओं से बच सकते हैं।

+0

चूंकि वह कक्षाओं का उपयोग कर रहा है, इसलिए एक अन्य उदाहरण जो सूक्ष्म टूटने का कारण बन सकता है, स्थान के बारे में आपकी टिप्पणी के अलावा, यदि डीएलएल में रहने वाले वर्ग के भीतर नए सदस्य चर जोड़े जाते हैं। –

+0

@ निकबौगलिस, अनुस्मारक के लिए धन्यवाद - मैंने उस स्थिति को कवर करने के अपने जवाब में जोड़ा है। –

+0

आपकी मदद के लिए सभी को धन्यवाद। – sam