谢谢,我知道取得桌面文件夹的IshellFolder接口指针是这么写的:
    IShellFolder* psfRoot = NULL;
    SHGetDesktopFolder(&psfRoot);

解决方案 »

  1.   

    楼上,这是VC的语法,你怎么发到VB了。
      

  2.   

    因为在Windows Shell结构里面,桌面是所有目录的根目录,我查了一下MSDN,里面提供的方法是:首先通过SHGetDesktopFolder获得一个IShellFolder接口对象,然后调用接口的ParseDisplayName方法获得某一个目录的PIDL,然后再调用接口的BindToObject获得该目录暴露的接口,例如IShellIcon、IShellFolder2等。
      

  3.   

    谢谢,TechnoFantasy(冰儿马甲www.applevb.com)
    我也看了,是想找段源码参考一下,谢谢,我再试试
      

  4.   

    有VC的代码可以供你参考一下:#include <shlobj.h>void EnumerateFolder(LPCTSTR path)
    {
       HRESULT hr; // COM result, you'd better examine it in your code!
       hr = CoInitialize(NULL); // initialize COM
       // NOTE: usually COM would be initialized just once in your main()   LPMALLOC pMalloc = NULL; // memory manager, for freeing up PIDLs
       hr = SHGetMalloc(&pMalloc);   LPSHELLFOLDER psfDesktop = NULL; // namespace root for parsing the path
       hr = SHGetDesktopFolder(&psfDesktop);   // IShellFolder::ParseDisplayName requires the path name in Unicode.
       OLECHAR olePath[MAX_PATH]; // wide-char version of path name
       MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, path, -1, olePath, MAX_PATH);   // parse path for absolute PIDL, and connect to target folder
       LPITEMIDLIST pidl = NULL; // general purpose
       hr = psfDesktop->ParseDisplayName(NULL, NULL, olePath, NULL, &pidl, NULL);
       LPSHELLFOLDER psfFolder = NULL;
       hr = psfDesktop->BindToObject(pidl, NULL, IID_IShellFolder, 
                                     (void**)&psfFolder);
       psfDesktop->Release(); // no longer required
       pMalloc->Free(pidl);   LPENUMIDLIST penumIDL = NULL; // IEnumIDList interface for reading contents
       hr = psfFolder->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, 
                                   &penumIDL);
       while(1) {
          // retrieve a copy of next local item ID list
          hr = penumIDL->Next(1, &pidl, NULL);
          if(hr == NOERROR) {
             WIN32_FIND_DATA ffd; // let's cheat a bit :)
             hr = SHGetDataFromIDList(psfFolder, pidl, SHGDFIL_FINDDATA, &ffd, 
                                      sizeof(WIN32_FIND_DATA));         cout << "Name = " << ffd.cFileName << endl;
             cout << "Type = " << ( (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                                    ? "dir\n" : "file\n" );
             cout << "Size = " << ffd.nFileSizeLow << endl;
             
             pMalloc->Free(pidl);
          }
          // the expected "error" is S_FALSE, when the list is finished
          else break;
       }   // release all remaining interface pointers
       penumIDL->Release();
       psfFolder->Release();
       pMalloc->Release();   CoUninitialize(); // shut down COM
    }