2009-02-03 2 views
7

इस सी एपीआई घोषणा को देखते हुए इसे सी # में कैसे आयात किया जाएगा?सी # को कॉन्स्ट चार * एपीआई कैसे आयात करें?

const char* _stdcall z4LLkGetKeySTD(void); 

मैं इतनी दूर प्राप्त करने में सक्षम किया गया है:

[DllImport("zip4_w32.dll", 
     CallingConvention = CallingConvention.StdCall, 
     EntryPoint = "z4LLkGetKeySTD", 
     ExactSpelling = false)] 
    private extern static const char* z4LLkGetKeySTD(); 

उत्तर

12

इस

[DllImport("zip4_w32.dll", 
     CallingConvention = CallingConvention.StdCall, 
     EntryPoint = "z4LLkGetKeySTD", 
     ExactSpelling = false)] 
    private extern static IntPtr z4LLkGetKeySTD(); 

प्रयास करें तब आप Marshal.PtrToStringAnsi का उपयोग करके एक स्ट्रिंग के लिए परिणाम परिवर्तित कर सकते हैं()। आपको अभी भी उपयुक्त मार्शल का उपयोग करके IntPtr के लिए स्मृति मुक्त करने की आवश्यकता होगी। फ्री * विधि।

+0

आप कैसे जानते हैं कि मार्शल। फ्री * विधि का उपयोग किया जाना चाहिए? –

+0

@thelaughingdm, यह इस बात पर निर्भर करता है कि स्मृति आवंटित कैसे किया गया था। मार्शल। फ्रीकॉटकमैमएलोक एक मूल CoTaskMemAlloc मुक्त करता है। प्रत्येक एक विशेष देशी विधि के साथ काम करता है – JaredPar

2

बस के बजाय 'स्थिरांक चार *' 'स्ट्रिंग' का उपयोग करें।

संपादित करें: जेरेडपर ने समझाया कि यह खतरनाक है। यदि आप एक स्वतंत्र नहीं चाहते हैं, तो इस विधि का उपयोग न करें।

+0

आपने मेरे मुंह से शब्दों को लिया! – leppie

+0

निश्चित रूप से स्ट्रिंग का उपयोग न करें। यदि किसी फ़ंक्शन की वापसी स्ट्रिंग है तो सीएलआर देशी पॉइंटर को CoTaskMemFree करने का प्रयास करेगा, जो संभवतः उपयोगकर्ता – JaredPar

+1

http://msdn.microsoft.com/en-us/magazine/cc164193.aspx के नीचे नहीं चाहता है चित्र 8 – JaredPar

4

हमेशा सी ++ कॉन्स char * या char * का उपयोग करें और std :: string नहीं।

यह भी ध्यान रखें कि सी ++ में चार सी # में एक sbyte है और हस्ताक्षरित चार सी # में बाइट है।

डीएलआईपोर्ट से निपटने के दौरान असुरक्षित कोड का उपयोग करने की सलाह दी जाती है।

[DllImport("zip4_w32.dll", 
    CallingConvention = CallingConvention.StdCall, 
    EntryPoint = "z4LLkGetKeySTD", 
    ExactSpelling = false)] 
private extern static sbyte* or byte* z4LLkGetKeySTD(); 

void foo() 
{ 
    string res = new string(z4LLkGetKeySTD()); 
} 
संबंधित मुद्दे