परिचय संशोधित कर रहा है - लंबा और उबाऊ हिस्सा
(सवाल अंत में है)तीसरे पक्ष के कोड एफपीयू नियंत्रण शब्द
मैं हो रही है सिर पर गंभीर एक तीसरी पार्टी COM घटक है कि रहता है से अधिक दर्द एफपीयू नियंत्रण शब्द बदल रहा है।
मेरे विकास पर्यावरण विंडोज और विजुअल C++ 2008 सामान्य एफपीयू नियंत्रण शब्द निर्दिष्ट करता है कि कोई अपवाद विभिन्न शर्तों के दौरान फेंक दिया जाना चाहिए। मैंने _CW_DEFAULT
मैक्रो float.h
में पाए गए मैक्रो के साथ-साथ स्टार्टअप पर डीबगर में नियंत्रण शब्द को देखकर दोनों को सत्यापित किया है।
हर मैं COM वस्तु में एक फोन करना, नियंत्रण शब्द वापसी पर संशोधित किया गया है। इसके खिलाफ बचाव करना आसान है। मैं बस नियंत्रण शब्द रीसेट करता हूं, और सब अच्छा है। समस्या तब होती है जब COM घटक मेरे ईवेंट सिंक को कॉल करना शुरू कर देता है। जैसे ही मुझे इवेंट कॉल प्राप्त होता है, मैं नियंत्रण शब्द को रीसेट करके अपने कोड की रक्षा कर सकता हूं, लेकिन जैसे ही मैं ईवेंट कॉल से वापस लौटता हूं, मैं कुछ भी नहीं कर सकता।
मैं इस COM घटक के लिए स्रोत की जरूरत नहीं है, लेकिन मैं लेखक के साथ संपर्क में हूँ। मेरे द्वारा किए गए प्रतिक्रियाएं "हू?" रही हैं। मुझे नहीं लगता कि उसके पास थोड़ी सी सुराग है जिसके बारे में मैं बात कर रहा हूं, इसलिए मुझे डर है कि मुझे इसके बारे में कुछ करना है। मेरा मानना है कि उसका रनटाइम (मुझे लगता है कि यह या तो डेल्फी या बोर्लैंड सी ++ है, क्योंकि डीएलएल प्रतीकात्मक नामों से भरा है, सभी पूंजी टी से शुरू होते हैं), या कुछ अन्य तीसरे पक्ष कोड का उपयोग कर रहे हैं, जिससे समस्या आ रही है। मुझे नहीं लगता कि उसका कोड स्पष्ट रूप से एफपीयू नियंत्रण शब्द को संशोधित करता है।
तो, मैं क्या कर सकता हूं? व्यवसाय के दृष्टिकोण से, इस तीसरे पक्ष के घटक का उपयोग करना जरूरी है। तकनीकी दृष्टि से, मैं इसे हटा सकता हूं, और संचार के प्रोटोकॉल को स्वयं कार्यान्वित कर सकता हूं। हालांकि, यह वास्तव में महंगा होगा, क्योंकि इस प्रोटोकॉल में क्रेडिट कार्ड लेनदेन को संभालना शामिल है। हम देयता को नहीं लेना चाहते हैं।
मैं सख्त एक हैक के आसपास, या Borland उत्पादों है कि मैं घटक के लेखक के पास भेजने के कर सकते हैं में एफपीयू सेटिंग्स के बारे में कुछ उपयोगी जानकारी की जरूरत है।
सवाल
क्या मैं कर सकते हैं? मुझे नहीं लगता कि घटक लेखक के पास इसे ठीक करने के लिए क्या लगता है (उसके बजाय अनजान प्रतिक्रियाओं से निर्णय लेना)।
मैं अपने खुद के अपवाद संचालक, जिसमें मैं सिर्फ हैंडलर में नियंत्रण शब्द रीसेट करें, और क्रियान्वित करने के लिए जारी करने के लिए Windows बता स्थापित करने के विचार के साथ की है। मैंने हैंडलर को SetUnhandledExceptionFilter()
के साथ स्थापित करने का प्रयास किया, लेकिन किसी कारण से अपवाद पकड़े नहीं गए।
- मैं अपवादों को क्यों नहीं पकड़ रहा हूं?
- अगर मैं एफपीयू अपवादों को पकड़ने, एफपीयू नियंत्रण शब्द को रीसेट के साथ सफल, और सिर्फ निष्पादन जारी रखने के लिए कुछ भी नहीं के रूप में हुआ है करते हैं - सब दांव तो दूर कर रहे हैं?
अद्यतन
मैं अपने सुझाव के लिए हर किसी को धन्यवाद देना चाहते हैं। मैंने लेखक निर्देशों को सिर्फ इतना ही नहीं, बल्कि उनके कोड के कई अन्य ग्राहकों के लिए जीवन को आसान बनाने के लिए किया है। मैंने उन्हें सुझाव दिया कि उन्हें DllMain(DLL_PROCESS_ATTACH)
पर एफपीयू नियंत्रण शब्द का नमूना देना चाहिए, और बाद में नियंत्रण शब्द को सहेजना चाहिए, ताकि वह मेरे ईवेंट हैंडलर को कॉल करने से पहले और मेरी कॉल से लौटने से पहले एफपीयू सीडब्ल्यू को रीसेट कर सके।
अभी के लिए, यदि कोई दिलचस्पी लेता है तो मेरे पास हैक-चार है। हैक-आस-पास संभावित रूप से खराब है, क्योंकि मुझे नहीं पता कि यह पर कोड के साथ क्या करेगा। मुझे पहले पुष्टि मिली है कि वह अपने कोड में किसी भी फ़्लोटिंग पॉइंट नंबर का उपयोग नहीं करता है, इसलिए यह सुरक्षित होना चाहिए, कुछ तीसरे पक्ष कोड को छोड़कर, जो एफपीयू अपवादों पर निर्भर करता है।
दो संशोधनों मैं अपने ऐप को बना दिया है:
- लपेटें मेरा संदेश पंप
- कोने मामलों में जहां संदेश पंप पार हो जाने को पकड़ने के लिए एक खिड़की हुक (
WH_CALLWNDPROC
) स्थापित करें
दोनों मामलों में, मैं जांचता हूं कि एफपीयू सीडब्ल्यू बदल गया है या नहीं। यदि यह है, तो मैं इसे _CW_DEFAULT
पर रीसेट कर देता हूं।
http://www.virtualdub.org/blog/pivot/entry.php?id=53; लंबी कहानी छोटी, उन्होंने किसी भी "खतरनाक" कोड पथ के बाद एफपीयू नियंत्रण दुनिया को बहाल करने के लिए कोड भी जोड़ा, लेकिन पोस्ट का उल्लेख है कि "बोर्लैंड रन-टाइम लाइब्रेरी के इस व्यवहार को अक्षम करना और इस समस्या से बचना संभव है" –
@matteo , लिंक के लिए आपको धन्यवाद। एक दिलचस्प पढ़ा! मैं इसे लेखक को अग्रेषित करूंगा। –
वैसे, मुझे लगता है कि उस पोस्ट में उल्लिखित व्यवहार को अक्षम करने का तरीका वास्तव में Set8087CW फ़ंक्शन का उपयोग कर रहा है, जैसा कि @ डेविड द्वारा उनके उत्तर में बताया गया है। –