public static extern int RegisterDragDrop(
     IntPtr hWnd,
     Raccoom.Win32.IDropTarget IdropTgt);
 /// <summary>
 /// Do we have to add a dummy node (+ sign)
 /// </summary>
 protected virtual bool IsFolderWithChilds(Raccoom.Win32.ShellItem fi)
 {
     return _showAllShellObjects || (fi.IsFileSystem && fi.IsFolder && !fi.IsBrowsable);
 }
 protected virtual TreeNodePath CreateTreeNode(System.Windows.Forms.TreeNodeCollection parentCollection, TreeNodePath parentNode, Raccoom.Win32.ShellItem shellItem)
 {
     if (shellItem == null) throw new ArgumentNullException("shellItem");
     //
     TreeNodePath node = CreateTreeNode(parentCollection, parentNode, shellItem.Text, shellItem.Path, !shellItem.IsFolder, shellItem.HasSubfolder, !shellItem.IsFileSystem);
     node.ImageIndex = shellItem.ImageIndex;
     node.SelectedImageIndex = shellItem.SelectedImageIndex;
     node.Tag = shellItem;
     //
     shellItem.ShellItemUpdated += delegate(object sender, EventArgs e)
     {
         node.Text = shellItem.Text;
         node.ImageIndex = shellItem.ImageIndex;
         node.SelectedImageIndex = shellItem.SelectedImageIndex;
     };
     return node;
 }
 /// <summary>
 /// Popluates the MyComputer node
 /// </summary>
 /// <param name="folderItem"></param>
 /// <param name="parentCollection"></param>
 /// <param name="helper"></param>
 protected virtual void FillMyComputer(Raccoom.Win32.ShellItem folderItem, System.Windows.Forms.TreeNodeCollection parentCollection, TreeViewFolderBrowserNodeFactory helper)
 {
     _rootCollection = parentCollection;
     // get wmi logical disk's if we have to
     System.IO.DriveInfo driveInfo;
     //
     folderItem.Expand(true, true, System.IntPtr.Zero);
     //
     foreach (Raccoom.Win32.ShellItem fi in folderItem.SubFolders)
     {
         // only File System shell objects ?
         if (!_showAllShellObjects && !fi.IsFileSystem) continue;
         //
         if (DriveTypes != DriveTypes.All && fi.IsDisk)
         {
             driveInfo = new System.IO.DriveInfo(fi.Path);
             //
             switch (driveInfo.DriveType)
             {
                 case System.IO.DriveType.CDRom:
                     if ((DriveTypes & DriveTypes.CompactDisc) == 0) continue;
                     break;
                 case System.IO.DriveType.Fixed:
                     if ((DriveTypes & DriveTypes.LocalDisk) == 0) continue;
                     break;
                 case System.IO.DriveType.Network:
                     if ((DriveTypes & DriveTypes.NetworkDrive) == 0) continue;
                     break;
                 case System.IO.DriveType.NoRootDirectory:
                     if ((DriveTypes & DriveTypes.NoRootDirectory) == 0) continue;
                     break;
                 case System.IO.DriveType.Ram:
                     if ((DriveTypes & DriveTypes.RAMDisk) == 0) continue;
                     break;
                 case System.IO.DriveType.Removable:
                     if ((DriveTypes & DriveTypes.RemovableDisk) == 0) continue;
                     break;
                 case System.IO.DriveType.Unknown:
                     if ((DriveTypes & DriveTypes.NoRootDirectory) == 0) continue;
                     break;
             }
         }
         // create new node
         TreeNodePath node = CreateTreeNode(parentCollection, null, fi);
     }
 }
        public static bool GetIDropTarget(ShellItem item, out IntPtr dropTargetPtr, out Raccoom.Win32.IDropTarget dropTarget)
        {
            ShellItem parent = item.ParentItem != null ? item.ParentItem : item;

            if (parent.ShellFolder.GetUIObjectOf(
                    IntPtr.Zero,
                    1,
                    new IntPtr[] { item.PIDLRel.Ptr },
                    ref ShellAPI.IID_IDropTarget,
                    IntPtr.Zero,
                    out dropTargetPtr) == ShellAPI.S_OK)
            {
                dropTarget =
                    (Raccoom.Win32.IDropTarget)Marshal.GetTypedObjectForIUnknown(dropTargetPtr, typeof(Raccoom.Win32.IDropTarget));

                return true;
            }
            else
            {
                dropTarget = null;
                dropTargetPtr = IntPtr.Zero;
                return false;
            }
        }