Esempio n. 1
0
File: Helper.cs Progetto: turky-9/yu
        public static bool GetNewContextMenu(IntPtr pidl, out IntPtr iContextMenuPtr, out IContextMenu iContextMenu)
        {
            //アンマネージなIContextMenuを作成する
            if (Ole32Wrapper.CoCreateInstance(
                    ref GUIDs.CLSID_NewMenu,
                    IntPtr.Zero,
                    CLSCTX.INPROC_SERVER,
                    ref GUIDs.IID_IContextMenu,
                    out iContextMenuPtr) == Shell32Wrapper.S_OK)
            {
                //アンマネージからマネージなオブジェクトを取得
                iContextMenu = Marshal.GetTypedObjectForIUnknown(iContextMenuPtr, typeof(IContextMenu)) as IContextMenu;

                //アンマネージなIContextMenuからアンマネージなIShellExtInitを取得する
                IntPtr iShellExtInitPtr;
                if (Marshal.QueryInterface(
                        iContextMenuPtr,
                        ref GUIDs.IID_IShellExtInit,
                        out iShellExtInitPtr) == Shell32Wrapper.S_OK)
                {
                    //アンマネージからマネージなオブジェクトを取得
                    IShellExtInit iShellExtInit = Marshal.GetTypedObjectForIUnknown(iShellExtInitPtr, typeof(IShellExtInit)) as IShellExtInit;

                    //とりあえず初期化する
                    //マナーのようです
                    int hresult = iShellExtInit.Initialize(pidl, IntPtr.Zero, 0);

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

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

                    if (iContextMenuPtr != IntPtr.Zero)
                    {
                        Marshal.Release(iContextMenuPtr);
                        iContextMenuPtr = IntPtr.Zero;
                    }

                    return(false);
                }
            }
            else
            {
                iContextMenuPtr = IntPtr.Zero;
                iContextMenu    = null;
                return(false);
            }
        }
Esempio n. 2
0
        /*
         * public static bool GetIStream(ShellItem item, out IntPtr streamPtr, out IStream stream)
         * {
         *  if (item.ParentItem.ShellFolder.BindToStorage(
         *              item.PIDLRel.Ptr,
         *              IntPtr.Zero,
         *              ref Shell32Wrapper.IID_IStream,
         *              out streamPtr) == Shell32Wrapper.S_OK)
         *  {
         *      stream = (IStream)Marshal.GetTypedObjectForIUnknown(streamPtr, typeof(IStream));
         *      return true;
         *  }
         *  else
         *  {
         *      stream = null;
         *      streamPtr = IntPtr.Zero;
         *      return false;
         *  }
         * }
         */

        /*
         * public static bool GetIStorage(ShellItem item, out IntPtr storagePtr, out IStorage storage)
         * {
         *  if (item.ParentItem.ShellFolder.BindToStorage(
         *              item.PIDLRel.Ptr,
         *              IntPtr.Zero,
         *              ref Shell32Wrapper.IID_IStorage,
         *              out storagePtr) == Shell32Wrapper.S_OK)
         *  {
         *      storage = (IStorage)Marshal.GetTypedObjectForIUnknown(storagePtr, typeof(IStorage));
         *      return true;
         *  }
         *  else
         *  {
         *      storage = null;
         *      storagePtr = IntPtr.Zero;
         *      return false;
         *  }
         * }
         */

        #endregion

        #region Drag/Drop

        /*
         * /// <summary>
         * /// This method will use the GetUIObjectOf method of IShellFolder to obtain the IDataObject of a
         * /// ShellItem.
         * /// </summary>
         * /// <param name="item">The item for which to obtain the IDataObject</param>
         * /// <param name="dataObjectPtr">A pointer to the returned IDataObject</param>
         * /// <returns>the IDataObject the ShellItem</returns>
         * public static IntPtr GetIDataObject(ShellItem[] items)
         * {
         *  ShellItem parent = items[0].ParentItem != null ? items[0].ParentItem : items[0];
         *
         *  IntPtr[] pidls = new IntPtr[items.Length];
         *  for (int i = 0; i < items.Length; i++)
         *      pidls[i] = items[i].PIDLRel.Ptr;
         *
         *  IntPtr dataObjectPtr;
         *  if (parent.ShellFolder.GetUIObjectOf(
         *          IntPtr.Zero,
         *          (uint)pidls.Length,
         *          pidls,
         *          ref Shell32Wrapper.IID_IDataObject,
         *          IntPtr.Zero,
         *          out dataObjectPtr) == Shell32Wrapper.S_OK)
         *  {
         *      return dataObjectPtr;
         *  }
         *  else
         *  {
         *      return IntPtr.Zero;
         *  }
         * }
         */

        /*
         * /// <summary>
         * /// This method will use the GetUIObjectOf method of IShellFolder to obtain the IDropTarget of a
         * /// ShellItem.
         * /// </summary>
         * /// <param name="item">The item for which to obtain the IDropTarget</param>
         * /// <param name="dropTargetPtr">A pointer to the returned IDropTarget</param>
         * /// <returns>the IDropTarget from the ShellItem</returns>
         * public static bool GetIDropTarget(ShellItem item, out IntPtr dropTargetPtr, out IDropTarget dropTarget)
         * {
         *  ShellItem parent = item.ParentItem != null ? item.ParentItem : item;
         *
         *  if (parent.ShellFolder.GetUIObjectOf(
         *          IntPtr.Zero,
         *          1,
         *          new IntPtr[] { item.PIDLRel.Ptr },
         *          ref Shell32Wrapper.IID_IDropTarget,
         *          IntPtr.Zero,
         *          out dropTargetPtr) == Shell32Wrapper.S_OK)
         *  {
         *      dropTarget =
         *          (IDropTarget)Marshal.GetTypedObjectForIUnknown(dropTargetPtr, typeof(IDropTarget));
         *
         *      return true;
         *  }
         *  else
         *  {
         *      dropTarget = null;
         *      dropTargetPtr = IntPtr.Zero;
         *      return false;
         *  }
         * }
         */

        public static bool GetIDropTargetHelper(out IntPtr helperPtr, out IDropTargetHelper dropHelper)
        {
            if (Ole32Wrapper.CoCreateInstance(
                    ref GUIDs.CLSID_DragDropHelper,
                    IntPtr.Zero,
                    CLSCTX.INPROC_SERVER,
                    ref GUIDs.IID_IDropTargetHelper,
                    out helperPtr) == Shell32Wrapper.S_OK)
            {
                dropHelper =
                    (IDropTargetHelper)Marshal.GetTypedObjectForIUnknown(helperPtr, typeof(IDropTargetHelper));

                return(true);
            }
            else
            {
                dropHelper = null;
                helperPtr  = IntPtr.Zero;
                return(false);
            }
        }