2010-09-20 15 views
6

मैं कोड निम्नलिखित है [PInvoke कार्य करने के लिए एक कॉल स्टैक असंतुलित], एक बार मैं अपने एप्लिकेशन को चलाने मैं इस त्रुटित्रुटि फ़ंक्शन कॉल,

किसी को पता पाने के मैं कैसे इस त्रुटि को ठीक?

त्रुटि:

PInvoke कार्य करने के लिए एक कॉल 'testcamera EDSDKLib.EDSDK :: EdsDownloadEvfImage!' असंतुलित ढेर है। ऐसा संभव है क्योंकि प्रबंधित PInvoke हस्ताक्षर अप्रबंधित लक्ष्य हस्ताक्षर से मेल नहीं खाता है। जाँच करें कि बुला सम्मेलन और PInvoke हस्ताक्षर के मापदंडों लक्ष्य अप्रबंधित हस्ताक्षर

IntPtr cameraDev; 
      bool LVrunning = false; 
      uint err = EDSDK.EDS_ERR_OK; 
      uint device = 0; 
      IntPtr MemStreamRef = new IntPtr(0); 

      IntPtr EvfImageRef = new IntPtr(0); 
      PictureBox pbLV; 

      public LiveView(IntPtr c, PictureBox p) 
      { 
       cameraDev = c; 
       pbLV = p; 
      } 

      internal void StartLiveView() 
      { 
       //LVrunning = true; 
       //int i = 0; 

       // Get the output device for the live view image 
       err = EDSDK.EdsGetPropertyData(cameraDev, EDSDK.PropID_Evf_OutputDevice, 0, out device); 
       Debug.WriteLineIf(err != EDSDK.EDS_ERR_OK, String.Format("Get Property Data failed: {0:X}", err)); 
       Debug.WriteLineIf(err == EDSDK.EDS_ERR_OK, String.Format("Liveview output is: {0:x}", device)); 

       Thread.Sleep(1000); 

       // Set the computer as live view destination 
       if (err == EDSDK.EDS_ERR_OK) 
       { 
        err = EDSDK.EdsSetPropertyData(cameraDev, EDSDK.PropID_Evf_OutputDevice, 0, 
         Marshal.SizeOf(EDSDK.EvfOutputDevice_PC), EDSDK.EvfOutputDevice_PC); 
        Debug.WriteLine(String.Format("Liveview output to computer: {0:X}", err)); 
       } 

       // Create a memory stream for the picture 
       if (err == EDSDK.EDS_ERR_OK) 
       { 
        err = EDSDK.EdsCreateMemoryStream(0, out MemStreamRef); 
        Debug.WriteLine(String.Format("Create Memory Stream: {0:X}", err)); 
       } 

       // Get a reference to a EvfImage 

       if (err == EDSDK.EDS_ERR_OK) 
       { 

**//i get error here** 
        **err = EDSDK.EdsCreateEvfImageRef(MemStreamRef, out EvfImageRef);** 

        Debug.WriteLine(String.Format("Create Evf Imaage Ref: {0:X}", err)); 
       } 

       Thread.Sleep(2000); 
      } 
से मेल
+2

अधिक जानकारी -dllimport प्रदान करें, EdsDownloadEvfImage हस्ताक्षर – tom3k

+0

यह मेरा dllimport, [DllImport ("EDSDK.dll")] सार्वजनिक निर्वासन स्थिर uint EdsCreateEvfImageRef (IntPtr inStreamRef, बाहर IntPtr outEvfImageRef) है; – user1400

+1

और मूल हस्ताक्षर कार्य क्या है? – tom3k

उत्तर

3

जब एक मंच आह्वान (पी/आह्वान) कर रही है, आप CLR बताने के लिए क्या मापदंड हैं (जो निर्धारित करता है कि वे किस तरह मिल है marshalled) साथ ही लक्षित मूल विधि के कॉलिंग सम्मेलन क्या है कि रनटाइम जानता है कि तर्क के बाद उचित तरीके से धक्का देने के लिए कोड कैसे उत्पन्न करें और कॉल के बाद ढेर को साफ करें। यदि हस्ताक्षर मेल नहीं खाते हैं, तो आप जो भी देख रहे हैं उसके समान रनटाइम त्रुटियों के साथ समाप्त होते हैं।

त्रुटि संदेश मुद्दा अच्छी तरह से बताते हैं:

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

पी/वास्तविक देशी विधि हस्ताक्षर है कि इस को लागू करता है के खिलाफ EDSDK.EdsCreateEvfImageRef के लिए हस्ताक्षर आह्वान की तुलना करें।

DllImport विशेषता पर CallingConvention संपत्ति निर्दिष्ट करके आप पी/Invoke के कॉलिंग सम्मेलन को बदल सकते हैं। संभावना से अधिक, EDSDK.EdsCreateEvfImageRef के लिए कॉलिंग सम्मेलन आपके अन्य पी/आमंत्रणों के कॉलिंग सम्मेलन से मेल खाना चाहिए।

+0

मैंने अपना डीएल आयात डाला, [डीएलआईएमपोर्ट ("ईडीएसडीके.एलएल")] सार्वजनिक बाहरी स्थैतिक यूंट एडस्क्रेटएवफ इमेजरफ (इंटप्रेट इनस्ट्रीमआरफ, इंटप्राट आउटएवीएफआईमेज आरएफ); मेरा कोड गलत कहां है? – user1400

+0

आपके अन्य पी/आमंत्रण कैसा दिखते हैं? 'EdsDownloadEvfImage' के लिए मूल हस्ताक्षर कैसा दिखता है? –

+0

मुझे यकीन नहीं है कि मुझे यह मूल कोड हस्ताक्षर कहां मिल सकता है, मेरे पास मेरे डीएल का स्रोत नहीं है। मुझे केवल डीएलएल – user1400

24

कृपया उस फ़ंक्शन के लिए सीडीईसी कॉलिंग सम्मेलन का उपयोग करें। मुझसे मत पूछो क्यों, यह सिर्फ काम करता है।

[DllImport("EDSDK.dll", CallingConvention=CallingConvention.Cdecl)] 
public extern static uint EdsCreateEvfImageRef(IntPtr inStreamRef, out IntPtr outEvfImageRef); 

[DllImport("EDSDK.dll",CallingConvention=CallingConvention.Cdecl)] 
public extern static uint EdsDownloadEvfImage(IntPtr inCameraRef, IntPtr outEvfImageRef); 
+0

है जो उपयोगी संकेत के लिए धन्यवाद! – esskar

+3

'सीडीईसीएल': कॉलर ढेर को साफ करता है। यह varargs के साथ कॉलिंग फ़ंक्शंस को सक्षम बनाता है, जो पैरामीटर की एक चर संख्या को स्वीकार करने वाले तरीकों के लिए उपयोग करने के लिए उपयुक्त बनाता है। यह प्रत्येक फ़ंक्शन कॉल को स्टैक क्लीनअप कोड शामिल करने के लिए बनाता है। http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.callingconvention।एएसपीएक्स – nunespascal

2

मैं पोस्टर के रूप में ही मुद्दा था, पता चला मैं अपने प्रोजेक्ट EDSDK पुस्तकालय (v2.10) का उपयोग कर .NET 3.5 के बजाय .NET 4.0 उपयोग करने के लिए बदलने की जरूरत है।

+0

मुझे भी इसी तरह की समस्या थी और मेरा संस्करण .NET 3.5 तक बनाकर हल हो गया – Anand

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