就是得到子文件夹的 IShellFolder 接口啊。PIDL 一般是通过 IShellFoder::EnumObjects 得到。

解决方案 »

  1.   

    IShellFolder *psfDesktop=NULL;
    LPITEMIDLIST *pidlItems=NULL;
    LPENUMIDLIST ppenum;SHGetDesktop(psfDesktop);
    psfDesktop->EnumObject(...,&ppenum);
    while(ppenum->Next()!=S_FALSE){
     Memo1->Lines->Add(...);
    }
    再查查相关函数。
      

  2.   

    to edyang(石头):
    1。PIDL 是单个的SHITEMID结构指针还是SHITEMID的列表的指针呢。
    2。BIND起什么作用呢。。
    3。PIDL与ISHELLFOLDER是不是一一对应呢。如果是:
    FIDesktopFolder->BindToObject (pidl,NULL,IID_IShellFolder,(void **&NewShellFolder);
    这个pidl应该是NewShellFolder(子文件夹)的呢。还是FIDesktopFolder的呢。
    kimryo(kimryo)大虾也帮助看看。。
      

  3.   

    这个BIND是得到子文件夹的PIDL么。可是正如WINDOWS的目录结构
    子文件夹这么多。那到底是哪个文件夹呢。而且得到子文件夹不是有个EnumObject么。
    大家帮助看看。。呵呵
      

  4.   

    系统的目录树称作“名域”。以Desktop为跟节点产生的树结构。系统中的每一文件夹都有唯一的ItemIDList.其结构如下(C:\windows\System)
     
     
       |Desktop|My Computer|C:|Windows|System|(长度不定)  用IShellFolder Interface可得到任意文件夹的ItemIDList,在用SHGetPathFromIDList便可得到文件夹的路径。(如c:\windows\system)
      或用IShellFodler::ParseDispayName得到ItemIDList.
      

  5.   

    用IShellFolder::BindToObject的得到是子目录的IShellFolder和ItemIDList.
      

  6.   

    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这样的结构。。不知道我说的是不是。。
      

  7.   

    C:\windows\system只是一个例子。不一定都是,如"控制面版“->“系统”(Virtual Object)则为:(上次表达有误)  ||length for Desktop|Desktop||length for mycomputer|MyComputer||length for controlpanel|Control Panel||length for system|system||每双竖线之间为一个ItemIDList.  还有的问题我发src给你,要说就太长了,况且我现在要去看笑傲江湖了(不是央视的哦)^_^
      

  8.   

    to kimryo(kimryo)兄:我觉得应该是这样了:
    BIND的PIDL应该是已经提供的。而不是去得到。而如何得到这个PIDL呢。就用ENUMOBJECT把
    另外你说的ItemIDList STRUCT我觉得很对。每个路径之间用个ItemIDList来隔开;
    不知道我的理解对不对。
      

  9.   

    我的理解是这样的:  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.
      

  10.   

    我的理解好象不是诶。。BIND起个联系ISHELLFOLDER的作用。
    ENUM起个找PIDL的作用。是着两个结合起来吧。。分别用这两个函数去
    得到这两个变量吧。。
    你说的&brvbar是什么意思呢。。
      

  11.   

    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||
      

  12.   

    不是吧。。PIDL应该提供吧。。
    SHGetSpecialFolderLocation(Application->Handle, CSIDL_DRIVES,&NewPIDL);
    FIDesktopFolder->BindToObject(NewPIDL, NULL, IID_IShellFolder,(void **)&NewShellFolder);
    这两句:NewPIDL应该是已知的啊。。呵呵。
      

  13.   

    不好意思,说错了。是用已知的PIDL取得到subfolder的IShellFolder指针。
      

  14.   

    谢谢kimryo大虾耐心的指教。
    可以加个朋友么。。呵呵。不过我现在在用BCB。