2010-11-13 14 views
7

मैंने एक वीसी ++ डीएल लिखा है।असंतुलित ढेर!

extern "C" _declspec(dllexport) 
void startIt(int number) 
{ 
    capture = cvCaptureFromCAM(number); 
} 

मैं पी का उपयोग कर/आह्वान एक सी # कोड में इस dll का उपयोग करें: dll में तरीकों में से एक के लिए घोषणा इस प्रकार है। मैं के रूप में घोषणा करते हैं:

[DllImport("Tracking.dll", EntryPoint = "startIt")] 
     public extern static void startIt(int number); 

और मैं के रूप में कोड में फ़ंक्शन को कॉल करें:

A call to PInvoke function 'UsingTracking!UsingTracking.Form1::startIt' has 
unbalanced the stack. This is likely because the managed PInvoke signature does 
not match the unmanaged target signature. Check that the calling convention 
and parameters of the PInvoke signature match the target unmanaged signature. 
:

startIt(0); 

अब, जब इस लाइन का सामना करना पड़ा है, संकलक मुझे इस त्रुटि फेंक रहा है

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

कृपया मदद करें।

धन्यवाद

+0

अपने मशीनों 86 में से एक और अन्य 64 है: स्टीफन Cleary इस पोस्ट पर इस पहचान करने के लिए श्रेय? –

+0

नहीं, दोनों x86 हैं। बस वह Win7 और अन्य XP – Jayesh

उत्तर

13

जब आप बाहरी फ़ंक्शन को पी/आह्वान करते हैं, तो calling convention__stdcall पर डिफ़ॉल्ट का उपयोग किया जाता है। अपने कार्य __cdecl सम्मेलन का उपयोग करता है के बाद से, आप इस तरह के रूप में यह घोषणा करने के लिए की जरूरत है:

[DllImport("Tracking.dll", EntryPoint = "startIt", 
    CallingConvention = CallingConvention.Cdecl)] 
public extern static void startIt(int number); 
+0

धन्यवाद जो काम करता है! हालांकि, मुझे अभी भी आश्चर्य है कि Win7 पर काम करते समय यह एक ही त्रुटि क्यों नहीं फेंक दिया! – Jayesh

+0

@ जेम्स, यह होना चाहिए, जब तक कि Win7 सही कॉलिंग सम्मेलन में स्विच करने के लिए दृश्यों के पीछे विशेष नलसाजी नहीं करता है। –

+0

@ जेम्स, क्या आपने Win7 पर सटीक उसी डीएल का उपयोग किया था या आपने इसे फिर से संकलित किया था? – Constantin

6

आप अपने DllImport विशेषता में CallingConvention=CallingConvention.Cdecl लापता हो सकता है?

+1

चलाता है यह समस्या तब होती है जब इस समस्या को डीबग करते हैं (.NET 4 पर स्विच करने के बाद)। यदि आप इसे निर्दिष्ट नहीं करते हैं तो 'stdcall' डिफ़ॉल्ट है! –

+0

यह भी मेरे लिए हल हो गया जब मैंने .NET 2 से .NET 4 तक पुराने समाधान को स्विच किया) –

4

Constantin और फ्रेडरिक Hamidi इस समस्या को ठीक करने के लिए के रूप में सही ढंग से इस सवाल का जवाब है। यह एक अंतिम स्टैक ओवरफ़्लो से बचने में मदद कर सकता है। मैंने कई बार खुद को काट दिया है। वास्तव में यहां खेलना वास्तव में है कि .NET 4 ने 32 बिट x86 मशीनों (64 बिट नहीं) पर डिबग (रिलीज़ नहीं) के लिए एक प्रबंधित डिबगिंग सहायक सक्षम किया है जो गलत तरीके से निर्दिष्ट पी/इनवॉक कॉल की जांच करता है। यह एमएसडीएन आलेख यह विवरण देता है: http://msdn.microsoft.com/en-us/library/0htdy0k3.aspxpinvokestackimbalance -- how can I fix this or turn it off?

संबंधित मुद्दे