c# - How to get a struct array to an IntPtr? -


सी ++ फ़ंक्शन प्रोटोटाइप है;

  / ********** ************************************************** *********** पैरामीटर [में]: शून्य * संभाल, चार * jpeg_buf, jpeg_buf jpeg_buf मापदंडों [बाहर]: सूचीआकार: परिणाम सूची आकार, अधिकतम & lt; = 1000; सूची: परिणाम ************************************************************************************************* ************************* / पूर्णांक getInfo (शून्य * संभाल, अहस्ताक्षरित चार * jpeg_buf, अहस्ताक्षरित int jpeg_len, पूर्णांक में & amp; list_size, जानकारी * info_list) ;   

सी ++ प्रकार;

  टाइप-टाइप स्ट्रेट {int dot_x; Int dot_y; } Attr; Typedef संरचना {int छोड़ दिया; Int शीर्ष; Int सही; इंट तल; } Rect_S; Typedef संरचना {rect_S rect; अटर्ट अटर; } जानकारी;   

सी # DLL आयात;

 <कोड> [DllImport ( "sample.dll", CallingConvention = CallingConvention.Cdecl)] आंतरिक स्थिर extern int getInfo (IntPtr संभाल, बाइट [] jpeg_buf, यूआईटीपी jpeg_len, आउट इंट सूची, बाहर निकालें IntPtr सूची);   

संरचनाएं सी # में हैं;

  आंतरिक संरचना Attr {public int dot_x; सार्वजनिक int dot_y; }; आंतरिक संरचना Rect_S {सार्वजनिक int छोड़ दिया; सार्वजनिक एट शीर्ष; सार्वजनिक int सही; सार्वजनिक अंतर नीचे; }; आंतरिक संरचना जानकारी {सार्वजनिक Rect_S rect; सार्वजनिक एटट्रेटर; };   

सी # गेटएन्फो फ़ंक्शन;

  सार्वजनिक जानकारी [] getInfo (बाइट [] स्कैन 0) {Info [] retVal = null; IntPtr structPtr = IntPtr.Zero; पूर्णांक आकार; इंट रेट = EFEngine.getInfo (यह.इंजिन, स्कैन0, (यूआईटी) स्कैन 0. लैंग, आउट आकार, आउट स्ट्रक्चरप्रट्रेट); यदि (रेट & gt; = 0) {retVal = नई जानकारी [आकार]; Int sizePointerInfo = Marshal.SizeOf (नया EFaceInfo ()); के लिए (int i = 0; मैं & LT; आकार; i ++) {retval [i] = (जानकारी) Marshal.PtrToStructure (नई IntPtr (structPtr.ToInt64 () + (मैं sizePointerInfo *)), typeof (जानकारी)); }} रिटर्न रेट वैल; }   

मुझे एक त्रुटि मिलती है "अतिरिक्त जानकारी: सुरक्षित मेमोरी को पढ़ने या लिखने का प्रयास किया गया। यह अक्सर संकेत है कि अन्य स्मृति भ्रष्ट है।"

  int getInfoTest (शून्य * हैंडल, अहस्ताक्षरित चार * jpeg_buf, अहस्ताक्षरित int jpeg_len, int & amp; सूची_आकार, FaceInfo * face_rect_list) {int nSizeNum = 0; जानकारी * सूची = नई जानकारी [32]; int nRet = getInfo (संभाल, jpeg_buf, jpeg_len, nSizeNum, सूची); अगर (nRet! = 0) {fprintf (stderr, "त्रुटि: getInfo विफल \ n"); } हटाएं [] सूची; हटाएं [] jpeg_buf; वापसी nRet; जैसा कि आपके पिछले प्रश्न पर हुआ है, प्रश्न में दी गई जानकारी अधूरी है।    

जैसा कि मैंने आपको वहां समझाने की कोशिश की, एक C ++ प्रोटोटाइप सी ++ फ़ंक्शन के शब्दों को पूरी तरह से निर्दिष्ट नहीं करता है। जैसा कि मैंने पहले आपको समझाया था, आपको उन शब्दों को शामिल करना चाहिए, या फ़ंक्शन को कॉल करने के लिए कम से कम कुछ उदाहरण C ++ कोड।

हालांकि, ऐसा लगता है कि समस्या अंतिम पैरामीटर है कॉलर को स्मृति आवंटित करने और उसके पते को फ़ंक्शन में पास करने की उम्मीद है। यह बहुत ही अंतिम पैरामीटर की तरह लग रहा है वास्तव में एक सरणी है। उस धारणा पर कार्य करना, पी / इनोकॉक्लेयर होना चाहिए:

  [DllImport ("sample.dll", कॉलिंगसंचार = कॉलिंगसंचार। CDEcl)] आंतरिक स्थिर extern int getInfo (IntPtr हैंडल, बाइट [ ] Jpeg_buf, uint jpeg_len, रेफरी इंट सूची, आकार, [आउट] जानकारी [] सूची);   

आप फ़ंक्शन को इस तरह कॉल करेंगे:

  int listSize = ...; // आपको किसी तरह काम करना है, यहां क्या जानकारी डालना है [सूची = नई जानकारी [listSize]; इंट रेटवेएल = getInfo (संभाल, jpeg_buf, jpeg_len, रिफ सूची आकार, सूची); // चेक रिव्लैवल   

बेशक, क्योंकि सूची का आकार पैरामीटर संदर्भ से पारित किया जाता है, जो यह सुझाव दे सकता है कि फ़ंक्शन आपको बता सकता है कि एक सरणी कितनी बड़ी है। तो शायद कॉल अनुक्रम होना चाहिए:

  int listSize = 0; इंट रेटवेएल = getInfo (संभाल, jpeg_buf, jpeg_len, रेफरी लिस्ट, आकार, रिक्त); // चेक रिटावल इन्फो [] सूची = नई जानकारी [सूची];; इंट रेटवेएल = getInfo (संभाल, jpeg_buf, jpeg_len, रिफ सूची आकार, सूची); // चेक रिववल    

Comments

Popular posts from this blog

Pass DB Connection parameters to a Kettle a.k.a PDI table Input step dynamically from Excel -

multithreading - PhantomJS-Node in a for Loop -

c++ - MATLAB .m file to .mex file using Matlab Compiler -