2012-08-09 7 views
5

मुझे मार्शलिंग के साथ कुछ समस्याएं आ रही हैं और मैं इसे अपने आप से नहीं समझ सकता। मैंने इस विषय की खोज की है, लेकिन अभी तक कोई भाग्य नहीं है, इसलिए मूल रूप से मैं अपने प्रबंधित सी # एप्लिकेशन से एक अप्रबंधित सी फ़ंक्शन को कॉल करने का प्रयास कर रहा हूं। सी समारोह के हस्ताक्षर इस तरह दिखता है:एक सीएचसीएआर * आउट पैरामीटर के साथ सी # से सी फ़ंक्शन कैसे कॉल करें?

long MyFunction(WCHAR* upn, long upnSize, WCHAR* guid, long* guidSize); 

मैं .dll फ़ाइल की एक्सेस नहीं है, मैं सिर्फ इतना पता है कि समारोह के उपयोग के लिए अवगत कराया जा रहा है और मैं जानता हूँ कि समारोह करने के लिए माना जाता है क्या, लेकिन मुझे नहीं पता कि अंदर क्या हो रहा है, इसलिए फ़ंक्शन को एक WCHAR * अपरिपक्व यूजरप्रिकिपलनाम प्राप्त होता है और आपूर्ति किए गए यूपीएन की लंबाई के साथ लंबा होता है। इसके अलावा एक WCHAR पॉइंटर पास किया जाता है, जहां फ़ंक्शन यूपीएन से जुड़े एक संबंधित GUID को लिखता है। GuidSize सूचक सूचक के आकार की आपूर्ति करता है, अगर यह बहुत छोटा है लिखित GUID पूरी तरह से लिखा नहीं है।

[DllImport(@"MyDll.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] 
public static extern long MyFunction(IntPtr upnPtr, long upnSize, [Out, MarshalAsAttribute(UnmanagedType.LPWStr) ] StringBuilder guidPtr, IntPtr guidSizePtr); 


//my attempt to call the Dll's exposed function 
string upn = [email protected]; 
long upnSize = upn.Length; 
IntPtr upnPtr = Marshal.StringToHGlobalUni(upn); 

IntPtr guidSizePtr = Marshal.AllocHGlobal(sizeof(long)); 
Marshal.WriteInt32(GuidSizePtr, 128); 
var guidSB = new StringBuilder(128); 

result = MyFunction(upnPtr, upnSize, guidSB, guidSizePtr); 

एक परिणाम मैं एक प्राप्त करते हैं: सब कुछ ठीक हो जाता है समारोह 0 (यह अभी तक कभी नहीं हुआ, जब सी # से कहा जाता है)

अब मेरी आह्वान और इस तरह इस समारोह नज़र कॉल करने के लिए प्रयासों को लौट जाना AccessViolationException। मैंने फ़ंक्शन को कॉल करने के लिए कई बदलावों के साथ खेला है, लेकिन मैंने कभी भी 0 को रिटर्न वैल्यू के रूप में प्राप्त नहीं किया है और मैं कभी भी GUID को पढ़ने में सक्षम नहीं था जैसा कि मुझे करना है।

इसके साथ किसी भी मदद की सराहना की जाएगी।

+0

पी/Invoke फ़ंक्शन घोषणा में 'स्ट्रिंगबिल्डर' का उपयोग करने के लिए शायद सबसे आसान है। –

+0

@ कोडीग्रे यह पहले से ही 'स्ट्रिंगबिल्डर guidPtr' है। 'guidPtr' आउटपुट पैरामीटर है, 'अपन' इनपुट है। – hvd

उत्तर

8

समारोह घोषित रूप में:

[DllImport(@"MyDll.dll", EntryPoint = "MyFunction", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)] 
    public static extern int MyFunction([MarshalAsAttribute(UnmanagedType.LPWStr)] string upnPtr, int upnSize, [MarshalAsAttribute(UnmanagedType.LPWStr)] StringBuilder guidPtr, ref int guidSizePtr); 

यह कॉल इस प्रकार है:,

 string upn = "[email protected]"; 
     var guidSB = new StringBuilder(128); 
     int guidSizePtr =guidSB.Capacity; 
     MyFunction(upn, upn.Length, guidSB, ref guidSizePtr); 

ध्यान दें कि लंबे समय से सी ++ में है 32-बिट ताकि आप में पूर्णांक के रूप में इस तरह के सभी उदाहरणों परिभाषित करना चाहिए अपने सी # कोड।

+0

धन्यवाद बहुत आकर्षण की तरह काम किया! : डी – butterwaach

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