2013-08-07 6 views
6

मैं C function के आस-पास एक रैपर लिखने की कोशिश कर रहा हूं जो फ़ंक्शन पॉइंटर और मनमानी उपयोगकर्ता डेटा (void*) की अपेक्षा करता है। फ़ंक्शन पॉइंटर मैंने यह पता लगाया है कि प्रतिनिधियों का उपयोग करने के साथ कैसे निपटें, लेकिन मैं यह नहीं समझ सकता कि object को void* में कैसे परिवर्तित किया जाए।ऑब्जेक्ट को शून्य * और वापस कनवर्ट करें?

मैं इसे एक ref object बजाय कर सकते हैं, के बाद से है कि एक सूचक की तरह बर्ताव करता AFAIK, लेकिन जब मैं कोशिश है कि मैं की तरह

एक अमान्य प्रकार एक के लिए एक अप्रबंधित VARIANT से एक रूपांतरण के दौरान पता चला था एक अपवाद मिल प्रबंधित वस्तु। सीएलआर में अमान्य वैरिएंट पास करने से अप्रत्याशित अपवाद, भ्रष्टाचार या डेटा हानि हो सकती है।

This "solution" मेरे लिए काम कर सकते हैं, लेकिन मैं समझ वहाँ एक सी DLL करने के लिए मनमाने ढंग से डेटा पारित करने के लिए इतना है कि यह बाद में वापस पारित किया जा सकता एक तरीका हो गया है?

+1

IntPtr के बारे में क्या? –

+0

व्यक्तिगत रूप से, मुझे लगता है कि आप 'फिक्स्ड' ब्लॉक के माध्यम से 'स्ट्रक्चर' में पॉइंटर का उपयोग करना बेहतर करेंगे ... –

+0

@NoIdeaForName: सी डीएलएल 'इंटिप्टर' कोई समस्या नहीं लेगा, लेकिन मैं इसे कैसे बदलूं वापस लौटने पर 'ऑब्जेक्ट' में वापस जाएं (और एक इंटिप्ट पर ऑब्जेक्ट को 'कास्ट' कैसे करें? – mpen

उत्तर

2

व्यक्तिगत रूप से, मैं struct का उपयोग करने की सलाह दूंगा, जो आप जो करने की कोशिश कर रहे हैं उसके लिए अधिक लागू है (यदि आप आवश्यकता हो तो आंतरिक लेआउट को ट्विक कर सकते हैं)। उदाहरण के लिए, एक struct Foo, और एक संदर्भ प्रकारfoo पर एक क्षेत्र के साथ:

unsafe void Bar() 
{ 
    fixed (Foo* ptr = &foo) // here foo is a field on a reference-type 
    { 
     void* v = ptr; // if you want void* 
     IntPtr i = new IntPtr(ptr); // if you want IntPtr 
     // use v or i here... 
    } 
} 

नोट: यदि foo एक स्थानीय चर है, तो यह ढेर पर है और यहां तक ​​कि की जरूरत नहीं है fixed हो:

unsafe void Bar() 
{ 
    Foo foo = new Foo(); 
    Foo* ptr = &foo; // here foo is a local variable 

    void* v = ptr; // if you want void* 
    IntPtr i = new IntPtr(ptr); // if you want IntPtr 
    // use v or i here... 
} 
+0

दूसरी बिट के बारे में एक प्रश्न - यदि 'foo' स्टैक पर है, तो इसे अंत में स्टैक से नहीं हटाया जाएगा समारोह, इस प्रकार सी डीएलएल को एक लटकते सूचक के साथ छोड़कर? – mpen

2

तो गलत मैं तुम्हें Pointer.Box और Pointer.UnBox तरीकों की जरूरत है नहीं कर रहा हूँ। ये विधियां अप्रबंधित सूचक बॉक्स को बॉक्स और अनबॉक्स करने में मदद करती हैं। एमएसडीएन पर Pointer.Box और Pointer.UnBox देखें।

+0

अगर मैं यह सही पढ़ रहा हूं, तो यह पीछे की ओर लगता है। 'बॉक्स' एक "आपूर्ति अप्रबंधित स्मृति सूचक" की अपेक्षा करता है। सी डीएलएल ने मुझे 'शून्य *' के साथ आपूर्ति नहीं की है, मुझे इसे पास करने के लिए एक उत्पन्न करने की आवश्यकता है। और मैं निश्चित रूप से निश्चित हूं कि 'ऑब्बॉक्स' तब तक असफल हो जाएगा जब तक 'ऑब्जेक्ट' पहले बॉक्स नहीं किया गया था। – mpen

+0

+1 वाह! मुझे 'पॉइंटर.बॉक्स' के बारे में पता नहीं था! – xanatos

+0

'userdata' का वास्तविक प्रकार क्या है जिसे आप पास करना चाहते हैं? –

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