2011-12-03 6 views
8

उम्मीद है कि इस एसओ के लिए भी अस्पष्ट नहीं है, लेकिन निम्नलिखित पी पर विचार/आह्वान हस्ताक्षर:एक पी/Invoke हस्ताक्षर में एक सुरक्षित हैंडल का उपयोग कैसे किया जा सकता है जिसके लिए कुछ मामलों में एक शून्य सूचक की आवश्यकता होती है?

[DllImport("odbc32.dll", CharSet = CharSet.Unicode)] 
internal static extern OdbcResult SQLAllocHandle(
    OdbcHandleType HandleType, 
    IntPtr InputHandle, 
    ref IntPtr OutputHandlePtr); 

मैं इस प्रकार इस हस्ताक्षर SafeHandles उपयोग करने के लिए नया स्वरूप, चाहते हैं:

[DllImport("odbc32.dll", CharSet = CharSet.Unicode)] 
internal static extern OdbcResult SQLAllocHandle(
    OdbcHandleType HandleType, 
    MySafeHandle InputHandle, 
    ref MySafeHandle OutputHandlePtr); 

हालांकि, according to MSDN, इनपुट हैडल तर्क एक शून्य सूचक होना चाहिए जब हैंडलटाइप तर्क SQL_HANDLE_ENV और गैर-शून्य सूचक अन्यथा है।

मैं एक ही पी/आमंत्रण हस्ताक्षर में उन अर्थशास्त्र को कैप्चर कैसे करूं? कृपया अपने उत्तर में एक उदाहरण कॉल-साइट शामिल करें। मेरा वर्तमान समाधान दो हस्ताक्षरों का उपयोग करना है।

उत्तर

4

SafeHandle एक कक्षा है इसलिए आपको वास्तविक SafeHandle की बजाय null पास करने में सक्षम होना चाहिए। एक शून्य संदर्भ पी/Invoke में एक शून्य सूचक के रूप में marshaled है।

SafeHandle handle = new SafeHandle(); 
OdbcResult result= SQLAllocHandle(OdbcHandleType.SQL_HANDLE_ENV, null, ref handle); 
+2

'सुरक्षित हेन्डहैंडल' पैरामीटर घोषित करना भी संभव है। –

+5

यहां काम नहीं करता है, मुझे 'System.StubHelpers.StubHelpers.SafeHandleAddRef (सेफहैंडल पीएचंडल, बूलियन और सफलता) से' ArgumentNullException' प्राप्त हो रहा है। ' – ordag

+0

हां, @ shf301, यह पी/आमंत्रण कॉल में काम नहीं करता है। क्या आपने इसे आजमाया? – jnm2

1

The answer by shf301 इनपुट तर्क InputHandle के लिए null गुजरता है। यह अधिकांश एपीआई पर काम नहीं करता है (शायद यह ओपी की विशिष्ट समस्या के लिए करता है, बशर्ते कि उन्होंने जवाब स्वीकार कर लिया हो)।

[SecurityPermission(SecurityAction.LinkDemand, UnmanagedCode = true)] 
public class RegionHandle : SafeHandleZeroOrMinusOneIsInvalid 
{ 
    private RegionHandle() : base(true) {} 

    public static readonly RegionHandle Null = new RegionHandle(); 

    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)] 
    override protected bool ReleaseHandle() 
    { 
     return Region.DeleteObject(handle); 
    } 
} 

इसका मतलब है कि मैं यह कर एक अशक्त संभाल पारित करने के लिए कर सकते हैं::

SomeApi(RegionHandle.Null); 

यह कैसे वहाँ एक IntPtr.Zero स्थिर सदस्य है के समान है

मैं इस पद्धति का उपयोग करें।

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

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