请教SHELL问题

csw 2001-05-12 09:14:00
如何用SHELL API列出桌面的所有ITEM啊。
包括那些快捷方式哦。
这个LPITEMIDLIST定义的指针到底是什么啊。
是类似“c:\programg files.."这样一串的列表还是单个的SHITEMID结构呢。
如果是单个的SHITEMID。怎么能找出文件夹所在的目录呢。。
还有这个BindToObject这个东西:
FIDesktopFolder->BindToObject (pidl,NULL,IID_IShellFolder,(void **)&NewShellFolder);
这个pidl应该是NewShellFolder(子文件夹)的呢。还是FIDesktopFolder的呢。
这个绑定起什么作用呢。。

...全文
223 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
kimryo 2001-05-17
  • 打赏
  • 举报
回复
好啊!俺的QQ:13885867.大家以后互相帮助嘛。

csw 2001-05-17
  • 打赏
  • 举报
回复
哦。忘了地址。呵呵。QQ:33854303
csw 2001-05-17
  • 打赏
  • 举报
回复
谢谢kimryo大虾耐心的指教。
可以加个朋友么。。呵呵。不过我现在在用BCB。
kimryo 2001-05-16
  • 打赏
  • 举报
回复
我的理解是这样的:

MS提供了SHGetSpecialFolderLocation这个涵数,用它获得较特殊的PIDL(如CSIDL_DRIVE,CSIDL_NETWORK等等),再用BintToObject去成成递进。用EnumObject可得到目录或可视对象(如"控制面版“->“系统”).要得图标可用IShellIcon.

"每个路径之间用个ItemIDList来隔开"什么意思??如是路径的话应改这样:

¦¦length for Desktop¦Desktop¦¦length for mycomputer¦MyComputer¦¦length for c:|C:||length for windows-dir|Windows||length for system|System||

每双竖线之间为一个ItemIDList.
csw 2001-05-16
  • 打赏
  • 举报
回复
to kimryo(kimryo)兄:我觉得应该是这样了:
BIND的PIDL应该是已经提供的。而不是去得到。而如何得到这个PIDL呢。就用ENUMOBJECT把
另外你说的ItemIDList STRUCT我觉得很对。每个路径之间用个ItemIDList来隔开;
不知道我的理解对不对。
kimryo 2001-05-16
  • 打赏
  • 举报
回复
不好意思,说错了。是用已知的PIDL取得到subfolder的IShellFolder指针。
csw 2001-05-16
  • 打赏
  • 举报
回复
不是吧。。PIDL应该提供吧。。
SHGetSpecialFolderLocation(Application->Handle, CSIDL_DRIVES,&NewPIDL);
FIDesktopFolder->BindToObject(NewPIDL, NULL, IID_IShellFolder,(void **)&NewShellFolder);
这两句:NewPIDL应该是已知的啊。。呵呵。
kimryo 2001-05-16
  • 打赏
  • 举报
回复
BintToObject是起递进的作用。我这样做过。MS对它的标准解释是在Getting a Pointer to a subfolder's IShellFolder Interface 中。它用来得到子目录的PIDL和IShellFolder Interface的指针。



||length for Desktop|Desktop||length for mycomputer|MyComputer||length for c:|C:|length for windows-dir|Windows||length for system|System||
csw 2001-05-16
  • 打赏
  • 举报
回复
我的理解好象不是诶。。BIND起个联系ISHELLFOLDER的作用。
ENUM起个找PIDL的作用。是着两个结合起来吧。。分别用这两个函数去
得到这两个变量吧。。
你说的¦是什么意思呢。。
kimryo 2001-05-15
  • 打赏
  • 举报
回复
用IShellFolder::BindToObject的得到是子目录的IShellFolder和ItemIDList.
kimryo 2001-05-15
  • 打赏
  • 举报
回复
系统的目录树称作“名域”。以Desktop为跟节点产生的树结构。

系统中的每一文件夹都有唯一的ItemIDList.其结构如下(C:\windows\System)


|Desktop|My Computer|C:|Windows|System|(长度不定)

用IShellFolder Interface可得到任意文件夹的ItemIDList,在用SHGetPathFromIDList便可得到文件夹的路径。(如c:\windows\system)
或用IShellFodler::ParseDispayName得到ItemIDList.
yuyulily 2001-05-15
  • 打赏
  • 举报
回复
关注
csw 2001-05-15
  • 打赏
  • 举报
回复
这个BIND是得到子文件夹的PIDL么。可是正如WINDOWS的目录结构
子文件夹这么多。那到底是哪个文件夹呢。而且得到子文件夹不是有个EnumObject么。
大家帮助看看。。呵呵
kimryo 2001-05-15
  • 打赏
  • 举报
回复
C:\windows\system只是一个例子。不一定都是,如"控制面版“->“系统”(Virtual Object)则为:(上次表达有误)

||length for Desktop|Desktop||length for mycomputer|MyComputer||length for controlpanel|Control Panel||length for system|system||

每双竖线之间为一个ItemIDList.

还有的问题我发src给你,要说就太长了,况且我现在要去看笑傲江湖了(不是央视的哦)^_^
csw 2001-05-15
  • 打赏
  • 举报
回复
to kimryo(kimryo):
那子文件夹这么多。那到底是哪个文件夹呢。而且得到子文件夹不是有个EnumObject么。
干吗用BIND呢。
而且你看:
SHGetSpecialFolderLocation(Application->Handle, CSIDL_DRIVES,&NewPIDL);
FIDesktopFolder->BindToObject(NewPIDL, NULL, IID_IShellFolder,(void **)&NewShellFolder);
他这两句是不是得到了“我的电脑”这个东西呢。
也就是说BIND一定要先提供子文件夹的PIDL这个东西呢(是已知还是未知的?)
而且你说ItemIDList类似C:\windows\System这种结构吗?我觉得好象不是。应该是System这样的吧。因为它是一个“首尾相连”的ITEMLIST结构。所以一串的ITEMLIST就显示了
C:\windows\System这样的结构。。不知道我说的是不是。。
chxr 2001-05-14
  • 打赏
  • 举报
回复
to edyang(石头):
1。PIDL 是单个的SHITEMID结构指针还是SHITEMID的列表的指针呢。
2。BIND起什么作用呢。。
3。PIDL与ISHELLFOLDER是不是一一对应呢。如果是:
FIDesktopFolder->BindToObject (pidl,NULL,IID_IShellFolder,(void **&NewShellFolder);
这个pidl应该是NewShellFolder(子文件夹)的呢。还是FIDesktopFolder的呢。
kimryo(kimryo)大虾也帮助看看。。

dave75 2001-05-14
  • 打赏
  • 举报
回复
gz
sswz 2001-05-14
  • 打赏
  • 举报
回复
gz
kimryo 2001-05-12
  • 打赏
  • 举报
回复
IShellFolder *psfDesktop=NULL;
LPITEMIDLIST *pidlItems=NULL;
LPENUMIDLIST ppenum;

SHGetDesktop(psfDesktop);
psfDesktop->EnumObject(...,&ppenum);
while(ppenum->Next()!=S_FALSE){
Memo1->Lines->Add(...);
}


再查查相关函数。
Edward 2001-05-12
  • 打赏
  • 举报
回复
就是得到子文件夹的 IShellFolder 接口啊。PIDL 一般是通过 IShellFoder::EnumObjects 得到。

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧