public bool GetOpenWithContextMenu(ShellObject item, out object iContextMenuPtr, out IContextMenu iContextMenu)
        {
            Guid CLSID_OpenWith = new Guid(0x09799AFB, 0xAD67, 0x11d1, 0xAB, 0xCD, 0x00, 0xC0, 0x4F, 0xC3, 0x09, 0x36);
            Guid iicm           = typeof(IContextMenu).GUID;
            Guid iise           = typeof(IShellExtInit).GUID;

            if (WindowsAPI.CoCreateInstance(
                    ref CLSID_OpenWith,
                    IntPtr.Zero,
                    0x1,
                    ref iicm,
                    out iContextMenuPtr) == (int)HResult.Ok)
            {
                iContextMenu = iContextMenuPtr as IContextMenu;

                IntPtr iShellExtInitPtr;
                if (Marshal.QueryInterface(
                        Marshal.GetIUnknownForObject(iContextMenuPtr),
                        ref iise,
                        out iShellExtInitPtr) == (int)HResult.Ok)
                {
                    IShellExtInit iShellExtInit = Marshal.GetTypedObjectForIUnknown(
                        iShellExtInitPtr, typeof(IShellExtInit)) as IShellExtInit;

                    try
                    {
                        iShellExtInit.Initialize(item.PIDL, IntPtr.Zero, 0);

                        Marshal.ReleaseComObject(iShellExtInit);
                        Marshal.Release(iShellExtInitPtr);

                        return(true);
                    }
                    finally
                    {
                    }
                }
                else
                {
                    if (iContextMenu != null)
                    {
                        Marshal.ReleaseComObject(iContextMenu);
                        iContextMenu = null;
                    }

                    if (iContextMenuPtr != null)
                    {
                        Marshal.ReleaseComObject(iContextMenuPtr);
                        iContextMenuPtr = null;
                    }

                    return(false);
                }
            }
            else
            {
                iContextMenuPtr = IntPtr.Zero;
                iContextMenu    = null;
                return(false);
            }
        }
        public bool GetNewContextMenu(ShellObject item, out object iContextMenuPtr, out IContextMenu iContextMenu)
        {
            Guid CLSID_NewMenu = new Guid("{D969A300-E7FF-11d0-A93B-00A0C90F2719}");
            Guid iicm          = typeof(IContextMenu).GUID;
            Guid iise          = typeof(IShellExtInit).GUID;

            if (WindowsAPI.CoCreateInstance(
                    ref CLSID_NewMenu,
                    IntPtr.Zero,
                    0x1,
                    ref iicm,
                    out iContextMenuPtr) == (int)HResult.Ok)
            {
                iContextMenu = iContextMenuPtr as IContextMenu;

                IntPtr iShellExtInitPtr;
                if (Marshal.QueryInterface(
                        Marshal.GetIUnknownForObject(iContextMenuPtr),
                        ref iise,
                        out iShellExtInitPtr) == (int)HResult.Ok)
                {
                    IShellExtInit iShellExtInit = Marshal.GetTypedObjectForIUnknown(
                        iShellExtInitPtr, typeof(IShellExtInit)) as IShellExtInit;

                    try
                    {
                        iShellExtInit.Initialize(item.PIDL, IntPtr.Zero, 0);

                        Marshal.ReleaseComObject(iShellExtInit);
                        Marshal.Release(iShellExtInitPtr);

                        return(true);
                    }
                    finally
                    {
                    }
                }
                else
                {
                    if (iContextMenu != null)
                    {
                        Marshal.ReleaseComObject(iContextMenu);
                        iContextMenu = null;
                    }

                    if (iContextMenuPtr != null)
                    {
                        Marshal.ReleaseComObject(iContextMenuPtr);
                        iContextMenuPtr = null;
                    }

                    return(false);
                }
            }
            else
            {
                iContextMenuPtr = IntPtr.Zero;
                iContextMenu    = null;
                return(false);
            }
        }