我有一个显示传递的父文件夹的子文件夹列表的函数。由于这是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。电话:
hr = desktop.BindToObject(parentPidl, null, IID_IShellFolder, out folder);
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));
除非没有,因为您无法绑定到桌面。
SHCreateItemFromIDList
也会失败。