Beispiel #1
0
        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);
        }
Beispiel #2
0
        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);
        }