Пример #1
0
 private void ReleaseAll()
 {
     if (null != this._oContextMenu)
     {
         Marshal.ReleaseComObject(this._oContextMenu);
         this._oContextMenu = null;
     }
     if (null != this._oContextMenu2)
     {
         Marshal.ReleaseComObject(this._oContextMenu2);
         this._oContextMenu2 = null;
     }
     if (null != this._oContextMenu3)
     {
         Marshal.ReleaseComObject(this._oContextMenu3);
         this._oContextMenu3 = null;
     }
     if (null != this._oDesktopFolder)
     {
         Marshal.ReleaseComObject(this._oDesktopFolder);
         this._oDesktopFolder = null;
     }
     if (null != this._oParentFolder)
     {
         Marshal.ReleaseComObject(this._oParentFolder);
         this._oParentFolder = null;
     }
     if (null != this._arrPIDLs)
     {
         this.FreePIDLs(this._arrPIDLs);
         this._arrPIDLs = null;
     }
 }
Пример #2
0
        private ShellContextMenu.IShellFolder GetDesktopFolder()
        {
            IntPtr zero = IntPtr.Zero;

            if (null == this._oDesktopFolder)
            {
                int num = ShellContextMenu.SHGetDesktopFolder(out zero);
                if (0 != num)
                {
                    throw new ShellContextMenuException("Failed to get the desktop shell folder");
                }
                this._oDesktopFolder = (ShellContextMenu.IShellFolder)Marshal.GetTypedObjectForIUnknown(zero, typeof(ShellContextMenu.IShellFolder));
            }
            return(this._oDesktopFolder);
        }
Пример #3
0
        private bool GetContextMenuInterfaces(ShellContextMenu.IShellFolder oParentFolder, IntPtr[] arrPIDLs, out IntPtr ctxMenuPtr)
        {
            int  uIObjectOf = oParentFolder.GetUIObjectOf(IntPtr.Zero, (uint)arrPIDLs.Length, arrPIDLs, ref ShellContextMenu.IID_IContextMenu, IntPtr.Zero, out ctxMenuPtr);
            bool result;

            if (0 == uIObjectOf)
            {
                this._oContextMenu = (ShellContextMenu.IContextMenu)Marshal.GetTypedObjectForIUnknown(ctxMenuPtr, typeof(ShellContextMenu.IContextMenu));
                result             = true;
            }
            else
            {
                ctxMenuPtr         = IntPtr.Zero;
                this._oContextMenu = null;
                result             = false;
            }
            return(result);
        }
Пример #4
0
 private ShellContextMenu.IShellFolder GetParentFolder(string folderName)
 {
     ShellContextMenu.IShellFolder result;
     if (null == this._oParentFolder)
     {
         ShellContextMenu.IShellFolder desktopFolder = this.GetDesktopFolder();
         if (null == desktopFolder)
         {
             result = null;
             return(result);
         }
         IntPtr zero = IntPtr.Zero;
         uint   num  = 0u;
         ShellContextMenu.SFGAO sFGAO = (ShellContextMenu.SFGAO) 0u;
         int num2 = desktopFolder.ParseDisplayName(IntPtr.Zero, IntPtr.Zero, folderName, ref num, out zero, ref sFGAO);
         if (0 != num2)
         {
             result = null;
             return(result);
         }
         IntPtr intPtr = Marshal.AllocCoTaskMem(524);
         Marshal.WriteInt32(intPtr, 0, 0);
         num2 = this._oDesktopFolder.GetDisplayNameOf(zero, ShellContextMenu.SHGNO.FORPARSING, intPtr);
         StringBuilder stringBuilder = new StringBuilder(260);
         ShellContextMenu.StrRetToBuf(intPtr, zero, stringBuilder, 260);
         Marshal.FreeCoTaskMem(intPtr);
         intPtr = IntPtr.Zero;
         this._strParentFolder = stringBuilder.ToString();
         IntPtr zero2 = IntPtr.Zero;
         num2 = desktopFolder.BindToObject(zero, IntPtr.Zero, ref ShellContextMenu.IID_IShellFolder, out zero2);
         Marshal.FreeCoTaskMem(zero);
         if (0 != num2)
         {
             result = null;
             return(result);
         }
         this._oParentFolder = (ShellContextMenu.IShellFolder)Marshal.GetTypedObjectForIUnknown(zero2, typeof(ShellContextMenu.IShellFolder));
     }
     result = this._oParentFolder;
     return(result);
 }
Пример #5
0
 protected IntPtr[] GetPIDLs(DirectoryInfo[] arrFI)
 {
     IntPtr[] result;
     if (arrFI == null || 0 == arrFI.Length)
     {
         result = null;
     }
     else
     {
         ShellContextMenu.IShellFolder parentFolder = this.GetParentFolder(arrFI[0].Parent.FullName);
         if (null == parentFolder)
         {
             result = null;
         }
         else
         {
             IntPtr[] array = new IntPtr[arrFI.Length];
             int      num   = 0;
             for (int i = 0; i < arrFI.Length; i++)
             {
                 DirectoryInfo          directoryInfo = arrFI[i];
                 uint                   num2          = 0u;
                 ShellContextMenu.SFGAO sFGAO         = (ShellContextMenu.SFGAO) 0u;
                 IntPtr                 zero          = IntPtr.Zero;
                 int num3 = parentFolder.ParseDisplayName(IntPtr.Zero, IntPtr.Zero, directoryInfo.Name, ref num2, out zero, ref sFGAO);
                 if (0 != num3)
                 {
                     this.FreePIDLs(array);
                     result = null;
                     return(result);
                 }
                 array[num] = zero;
                 num++;
             }
             result = array;
         }
     }
     return(result);
 }