绑定到桌面时BindToObject失败

时间:2014-08-17 16:50:31

标签: shell

我有一个显示传递的父文件夹的子文件夹列表的函数。由于这是shell编程,我们使用pidl s:

void ShowChildFolders(PItemIDList parentPidl)
{
   HRESULT hr;

   //Get ahold of the desktop object, the root of the everything
   IShellFolder desktop;
   SHGetDesktopFolder(out desktop);

   //Get the ShellFolder of the passed folder
   IShellFolder folder;
   hr = desktop.BindToObject(parentPidl, null, IID_IShellFolder, out folder);
   OleCheck(hr);

   /*Do what we were going to do...for example
   IEnumIDList list;
   hr = folder.EnumObjects(0, SHCONTF_FOLDERS, out list);

   ...etc
   */
}

我不控制传入的pidl。我的任务是绑定到pidl并显示内容。

该函数几乎适用于命名空间中的每个文件夹。例如:

//Show the contents of a folder
ShowChildFolders(GetFolderLocation(CSIDL_APPDATA));

//Show the contents of a folder
ShowChildFolders(GetFolderLocation(CSIDL_MYPICTURES));

//Show the contents of a folder
ShowChildFolders(GetFolderLocation(CSIDL_DESKTOPDIRECTORY));

我正在使用伪辅助函数:

PItemIDList GetFolderLocation(Int32 FolderCSIDL)
{
   PItemIDList pidl;
   HRESULT hr = SHGetFolderLocation(0, FolderCSIDL, 0, 0, ref pidl);
   //...snip....

   return pidl;
}

一个pidl让他们全部失败

但有一个pidl失败了。有一个我无法绑定的pidl。电话:

hr = desktop.BindToObject(parentPidl, null, IID_IShellFolder, out folder);

fail with

  

E_INVALIDARG一个或多个参数无效(0x80070057)

那个pidl是调用者需要的第一个pidl,因为在显示用户文件夹时:你必须从桌面开始:

//Show the contents of a folder
PItemIDList pidlDesktop = GetFolderLocation(CSIDL_APPDATA);
ShowChildFolders(pidlDesktop );

如何将桌面绑定到桌面?我们都知道所有shell操作必须从桌面文件夹开始。这是你唯一的方式:

SHGetDesktopFolder(out desktop);

实际上它是一棵树

实际上这是一种递归操作。我将项目添加到树中:

void FetchChildFolders(TreeNode parentNode, PItemIDList parentPidl)
{
   SHGetDesktop(desktop);

   desktop.BindToObject(parentPidl, ...);

   //...enumerate child folders, and add them as children of the tree node parentNode
}

我添加它们,因为用户扩展了节点:

void OnTreeNodeExpanding(e)
{
   TreeNode parentNode = e.Node;
   PItemIDList pidl = GetPidlFromNode(e.Node);

   FetchChildFolders(parentNode, pidl);
}

树最初在桌面上填充了文件夹:

FetchChildFolders(null, GetFolderLocation(CSIDL_DESKTOP));

除非没有,因为您无法绑定到桌面。

Bonus Chatter

传递桌面pidl时,

SHCreateItemFromIDList也会失败。

0 个答案:

没有答案
相关问题