Microsoft.VisualStudio.Project.OleServiceProvider.QueryService C# (CSharp) Method

QueryService() public method

public QueryService ( System.Guid &guidService, System.Guid &riid, IntPtr &ppvObject ) : int
guidService System.Guid
riid System.Guid
ppvObject System.IntPtr
return int
        public virtual int QueryService(ref Guid guidService, ref Guid riid, out IntPtr ppvObject)
        {
            ppvObject = (IntPtr)0;
            int hr = VSConstants.S_OK;

            ServiceData serviceInstance = null;

            if(services != null && services.ContainsKey(guidService))
            {
                serviceInstance = services[guidService];
            }

            if(serviceInstance == null)
            {
                return VSConstants.E_NOINTERFACE;
            }

            // Now check to see if the user asked for an IID other than
            // IUnknown.  If so, we must do another QI.
            //
            if(riid.Equals(VSConstants.IID_IUnknown))
            {
                ppvObject = Marshal.GetIUnknownForObject(serviceInstance.ServiceInstance);
            }
            else
            {
                IntPtr pUnk = IntPtr.Zero;
                try
                {
                    pUnk = Marshal.GetIUnknownForObject(serviceInstance.ServiceInstance);
                    hr = Marshal.QueryInterface(pUnk, ref riid, out ppvObject);
                }
                finally
                {
                    if(pUnk != IntPtr.Zero)
                    {
                        Marshal.Release(pUnk);
                    }
                }
            }

            return hr;
        }