c++ - गलत कॉलिंग सम्मेलन का उपयोग क्यों करता है कभी-कभी काम करता है?




winapi callback (3)

कंप्यूटर जहां अनुप्रयोग क्रैश हो सकता है। NET Framework संस्करण 4 का उपयोग कर रहा हो सकता है।

निम्नलिखित आलेख देखें: http://msdn.microsoft.com/en-us/library/ee941656.aspx

यह इंटरऑपरेबिलिटी के तहत निम्नलिखित बताता है - प्लेटफ़ॉर्म आमंत्रण:

"अप्रबंधित कोड के साथ इंटरऑपरेबिलिटी में प्रदर्शन में सुधार करने के लिए, प्लेटफॉर्म में गलत कॉलिंग सम्मेलनों के कारण अब आवेदन विफल हो जाता है। पिछले संस्करणों में, मार्शलिंग परत ने इन त्रुटियों को स्टैक तक हल किया था।"

मैंने खिड़कियों में एक कॉलबैक फ़ंक्शन (सर्विसमेन) को पंजीकृत करने के लिए "StartServiceCtrlDispatcher" फ़ंक्शन का उपयोग किया था, लेकिन मैंने कॉलबैक फ़ंक्शन को गलत कॉलिंग सम्मेलन के साथ संकलित किया

बात यह है कि कुछ कंप्यूटरों पर , जब कॉलबैक फ़ंक्शन से आवेदन वापस आ गया, तो एप्लिकेशन क्रैश हो गया, लेकिन अन्य कंप्यूटरों पर एप्लिकेशन क्रैश नहीं हुआ

अब, एक बार जब मैंने पाया कि बग सब कुछ काम करता है, लेकिन मुझे यह समझ में नहीं आता है कि कुछ कंप्यूटरों पर यह दुर्घटनाग्रस्त होने के बिना सही तरीके से काम क्यों करता है?

धन्यवाद! :-)


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

सौभाग्य से, x 64 में केवल एक कॉलिंग सम्मेलन है और यह पूरी गड़बड़ी अतीत में होगी।


यह सभी स्मृति में वर्तमान में क्या है से संबंधित है। मान लें कि आपके पास दो फ़ंक्शंस हैं:

void stdcall f1(...) { ... }

void cdecl f2(...) { ... }

stdcall Windows कॉलिंग सम्मेलन है, जबकि cdecl अधिकांश cdecl द्वारा उपयोग किया जाता है। उनके बीच का अंतर कॉल के बाद स्टैक को साफ करने की ज़िम्मेदारी का मालिक है। stdcall , callee ( f1 , या f2 ) cdecl में करता है, कॉलर करता है

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





calling-convention