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); } }
/* * 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); } }