public static object QueryInterface(object obj, Guid iid) { if (obj == null) { return(null); } // get an nsISupports (aka IUnknown) pointer from the objection IntPtr pUnk = Marshal.GetIUnknownForObject(obj); if (pUnk == IntPtr.Zero) { return(null); } // query interface IntPtr ppv; Marshal.QueryInterface(pUnk, ref iid, out ppv); // if QueryInterface didn't work, try using nsIInterfaceRequestor instead if (ppv == IntPtr.Zero) { // QueryInterface the object for nsIInterfaceRequestor Guid interfaceRequestorIID = typeof(nsIInterfaceRequestor).GUID; IntPtr pInterfaceRequestor; Marshal.QueryInterface(pUnk, ref interfaceRequestorIID, out pInterfaceRequestor); // if we got a pointer to nsIInterfaceRequestor if (pInterfaceRequestor != IntPtr.Zero) { // convert it to a managed interface QI_nsIInterfaceRequestor req = (QI_nsIInterfaceRequestor)Marshal.GetObjectForIUnknown(pInterfaceRequestor); // try to get the requested interface req.GetInterface(ref iid, out ppv); // clean up Marshal.ReleaseComObject(req); Marshal.Release(pInterfaceRequestor); } } object result = (ppv != IntPtr.Zero) ? Marshal.GetObjectForIUnknown(ppv) : null; Marshal.Release(pUnk); if (ppv != IntPtr.Zero) { Marshal.Release(ppv); } return(result); }
public static object QueryInterface(object obj, Guid iid) { AssertCorrectThread(); if (obj == null) { return(null); } // get an nsISupports (aka IUnknown) pointer from the object IntPtr pUnk = Marshal.GetIUnknownForObject(obj); if (pUnk == IntPtr.Zero) { return(null); } // query interface IntPtr ppv; Marshal.QueryInterface(pUnk, ref iid, out ppv); // if QueryInterface didn't work, try using nsIInterfaceRequestor instead if (ppv == IntPtr.Zero) { // QueryInterface the object for nsIInterfaceRequestor Guid interfaceRequestorIID = typeof(nsIInterfaceRequestor).GUID; IntPtr pInterfaceRequestor; Marshal.QueryInterface(pUnk, ref interfaceRequestorIID, out pInterfaceRequestor); // if we got a pointer to nsIInterfaceRequestor if (pInterfaceRequestor != IntPtr.Zero) { // convert it to a managed interface QI_nsIInterfaceRequestor req = (QI_nsIInterfaceRequestor)Xpcom.GetObjectForIUnknown(pInterfaceRequestor); if (req != null) { try { req.GetInterface(ref iid, out ppv); // clean up Marshal.ReleaseComObject(req); } catch (NullReferenceException ex) { Debug.WriteLine("NullRefException from native code.\n" + ex.ToString()); } } Marshal.Release(pInterfaceRequestor); } } object result = (ppv != IntPtr.Zero) ? Xpcom.GetObjectForIUnknown(ppv) : null; Marshal.Release(pUnk); if (ppv != IntPtr.Zero) { Marshal.Release(ppv); } return(result); }