एमटी-इश्यू की तरह पहली नजर में क्या दिखता है, लेकिन मैं COM + द्वारा उपयोग किए गए एसटीए मॉडल को विस्तार से समझने की कोशिश कर रहा हूं।लीगेसी वीबी 6 कॉम + डीएलएल देशी विन 32 डीएलएल में कॉलिंग - एसटीए के साथ थ्रेडिंग मुद्दे?
प्रभावी रूप से, मेरे पास एक विरासत COM + घटक है, जो वीबी 6 में लिखा गया है, जो सी ++ में लिखित विन 32 डीएलएल देशी (यानी, नहीं-COM) में कॉल करता है।
कुछ अंतःक्रियात्मक (और परीक्षण में पुन: उत्पन्न करने के लिए असंभव) होने के कारण, मैंने कुछ डीबगिंग कोड जोड़ा जो पता चल रहा था कि क्या हो रहा था और पाया कि जब समस्याएं होती हैं, तो मेरे पास फाइल में इंटरलवेड लॉग संदेश होते थे - इसलिए निहित है कि डीएलएल को दो धागे द्वारा एक बार में बुलाया जा रहा था।
अब लॉगिंग _getpid() और GetCurrentThreadId() पर आधारित प्रति-थ्रेड फ़ाइल पर जाती है, इसलिए ऐसा लगता है कि जब C++ DLL में कोड कहा जाता है, तो उसे एक ही समय में एक ही थ्रेड पर दो बार बुलाया जा रहा है । एसटीए की मेरी समझ का कहना है कि यह मामला हो सकता है क्योंकि COM एक ही थ्रेड पर ऑब्जेक्ट्स के अलग-अलग उदाहरणों को मार्शल करता है और इच्छानुसार निष्पादन को फिर से शुरू करता है।
असुविधाजनक रूप से मुझे यकीन नहीं है कि यहां से कहां जाना है। मैं पढ़ रहा हूं कि मुझे COMInitialiseEx() को DllMain() में COM को बताने के लिए कॉल करना चाहिए कि यह एक एसटीए डीएलएल है, लेकिन अन्य स्थानों का कहना है कि यह केवल COM DLL के लिए मान्य है और इसका मूल डीएलएल में कोई प्रभाव नहीं पड़ेगा। एकमात्र अन्य विकल्प डीएलएल के हिस्सों को एक्सेस को क्रमबद्ध करने के लिए महत्वपूर्ण वर्गों के रूप में लपेटना है (ठोड़ी पर जो भी प्रदर्शन हिट लेना है)।
मैं डीएलएल को आजमाकर पुनः प्रयास कर सकता हूं, लेकिन कोई साझा राज्य या वैश्विक युद्ध नहीं है - सबकुछ स्थानीय चर में है, इसलिए सिद्धांत में प्रत्येक कॉल को अपना खुद का ढेर मिलना चाहिए, लेकिन मुझे आश्चर्य है कि क्या एसटीए मॉडल मूल रूप से कुछ है इस पर अजीब प्रभाव और एक ही कॉल के रूप में एक ही प्रविष्टि बिंदु पर पहले से लोड डीएलएल में फिर से प्रवेश कर रहा है। असुविधाजनक रूप से, मुझे नहीं पता कि इस सिद्धांत को साबित या परीक्षण कैसे करें।
सवालों मूल रूप से कर रहे हैं:
- एक जाँच COM + घटक एक देशी DLL कॉल है, वहाँ को एसटीए मॉडल में कुछ भी नहीं है को रोकने के सक्रिय "सूत्र" निलंबित किया जा रहा है और नियंत्रण एक और "धागा करने के लिए पारित किया जा रहा "एक डीएलएल कॉल के बीच में?
- क्या CoInitialiseEx() इसे हल करने का सही तरीका है, या नहीं?
- यदि न तो (1) या (2) "अच्छी" धारणाएं हैं, तो क्या हो रहा है?
>> इसे एक ही समय में एक ही थ्रेड पर दो बार बुलाया जा रहा है। << अब यह मजाकिया है क्योंकि यह "एक ही समय में" नहीं हो सकता है। शायद यह कोड अपने आप को सबसे अच्छी तरह से बुला रहा है। – wqw