c# - What type to PInvoke for a char** -


निम्नलिखित सी फंक्शन पर विचार करें:

  शून्य get_lib_version (const char ** ver_string);   

मैं इस तरह PInvoke के साथ सही कैसे मार सकता हूँ? प्रलेखन कहते हैं कि यह एक स्थिर स्ट्रिंग के लिए एक सूचक देता है। मैंने सोचा कि यह ऐसा करेगा:

  [DllImport (DllPath, कॉलिंगसंचार = कॉलिंगसंचार। CDEcl)] सार्वजनिक स्थिर extern int get_lib_version (StringBuilder संस्करण);   

लेकिन मुझे जितना मिलता है, वह कमजोर है।

फ़ंक्शन रिटर्न एक नया सी-स्ट्रिंग पिनवोक मार्शलर हमेशा यह सुनिश्चित करता है कि एक मूल स्ट्रिंग को स्टोर करने के लिए आवश्यक स्मृति को फिर से जारी किया जाता है। यह एक अच्छा अंत नहीं होगा, निश्चित रूप से इस समारोह के कॉलर इसे रिलीज नहीं माना जाता है। const कीवर्ड एक मजबूत संकेत है कि मूल कोड एक संकेतक को एक स्ट्रिंग में लौटा देगा जो ढेर पर आवंटित नहीं किया गया है। ऐसे सूचक को जारी करने की कोशिश में आपके प्रोग्राम को बाद के विंडोज संस्करणों पर क्रैश हो जाएगा, जिस प्रकार का सख्त ढेर कार्यान्वयन (XP के बाद) है।

आपको मार्शलर को ऐसा करने से रोकने में मदद मिलनी चाहिए। इसके लिए आपको तर्क को एक कच्चे पॉइंटर के रूप में घोषित करने की आवश्यकता है, स्ट्रिंग नहीं:

  [DllImport (कॉलिंगसंचार = कॉलिंगसंचार। CDEcl)] सार्वजनिक स्थिर extern int get_lib_version (बाहर IntPtr संस्करण);   

और आपको पॉइंटर को स्ट्रिंग में कनवर्ट करने के लिए अतिरिक्त चरण बनाना होगा:

  सार्वजनिक स्ट्रिंग GetLibraryVersion () {IntPtr strptr; Get_lib_version (बाहर strptr); वापसी मार्शल.प्रट्रोस्ट्राइनएनसी (एसआरपीटीआर); }   

इस धारणा को सत्यापित करने के लिए थोड़ा परीक्षण कार्यक्रम लिखें। GetLibraryVersion () एक अरब बार कॉल करें अगर मेमोरी उपयोग में विस्फोट नहीं होता है तो आप अच्छे हैं।

Comments

Popular posts from this blog

c# - Roxy file manager in MVC doesn't accept session path -

php - proc_open Too many open files in long running Symfony Console app -

c# - Show a huge number of data in DevExpress GridView -