PIDL.h
上传用户:yatsl7111
上传日期:2007-01-08
资源大小:1433k
文件大小:3k
源码类别:

图形图象

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////
  2. // PIDL.h: interface for the CPIDL class.
  3. //
  4. #ifndef __PIDL_H
  5. #define __PIDL_H
  6. #include <shlobj.h>
  7. class CPIDL
  8. {
  9. public:
  10.     LPITEMIDLIST  m_pidl;
  11. // == Construction/Destruction == //
  12.     CPIDL() : m_pidl(NULL) {}
  13.     // Copy constructor
  14.     CPIDL(const CPIDL& cpidl) : m_pidl(NULL) { Set(cpidl); }
  15.     // From path (szPath relative to the folder psf) - see Set()
  16.     CPIDL(LPCTSTR szPath, LPSHELLFOLDER psf = m_sfDesktop); 
  17.     // From a list ptr - *doesn't* copy the actual data - see Set()
  18.     CPIDL(LPITEMIDLIST pidl) : m_pidl(pidl) {}
  19.     virtual ~CPIDL();
  20. // == Assignment == //
  21.     // Make a copy of cpidl's list data
  22.     HRESULT Set(const CPIDL& cpidl);
  23.     // Set by path: szPath relative to the folder psf.
  24.     HRESULT Set(LPCTSTR szPath, LPSHELLFOLDER psf = m_sfDesktop);
  25.     // Points the CPIDL to an existing item list: does *not* copy
  26.     // the actual data - just the pointer (unlike MakeCopyOf()).
  27.     HRESULT Set(LPITEMIDLIST pidl);
  28.     // Special Assignment: Copies the data of an exisiting list.
  29.     HRESULT MakeCopyOf(LPITEMIDLIST pidl);
  30.     // Special Assignment: Makes a PIDL rooted at the desktop.
  31.     HRESULT MakeAbsPIDLOf(LPSHELLFOLDER psf, LPITEMIDLIST pidl);
  32. // == Item Access == //
  33.     // Returns a pointer to the first item in the list
  34.     LPSHITEMID GetFirstItemID() const { return (LPSHITEMID)m_pidl; }
  35.     // Points to the next item in the list
  36.     void GetNextItemID(LPSHITEMID& pid) const 
  37.         { (LPBYTE &)pid += pid->cb; }
  38. // == General Operations == //
  39.     void Free();          // Frees the memory used by the item id list
  40.     UINT GetSize() const; // Counts the actual memory in use
  41.     // Split into direct parent and object pidls
  42.     void Split(CPIDL& parent, CPIDL& obj) const;
  43.     // Concatenation
  44.     CPIDL operator + (CPIDL& pidl) const;  // using + operator
  45.     static void Concat(const CPIDL &a, const CPIDL& b, 
  46.         CPIDL& result);                    // result = a+b (faster)
  47. // == Shell Name-space Access Helper Functions == //
  48.     // 1) Won't always work: psf->GetUIObjectOf(pidl, ... )
  49.     // 2) Will always work:  pidl.GetUIObjectOf(..., psf)
  50.     HRESULT GetUIObjectOf(REFIID riid, LPVOID *ppvOut, 
  51.         HWND hWnd = NULL, LPSHELLFOLDER psf = m_sfDesktop);
  52.     // Places the STRRET string in the cStr field.  
  53.     void ExtractCStr(STRRET& strRet) const;
  54. // == Conversion Operators == //
  55.     operator LPITEMIDLIST&  () { return m_pidl; }
  56.     operator LPITEMIDLIST * () { return &m_pidl; }
  57.     operator LPCITEMIDLIST  () const { return m_pidl; }
  58.     operator LPCITEMIDLIST* () const 
  59.         { return (LPCITEMIDLIST *)&m_pidl; }
  60. protected:
  61.     static LPSHELLFOLDER    m_sfDesktop;    // desktop object
  62.     static LPMALLOC         m_pAllocator;   // system allocator
  63.     // allocate memory for the pidl using the system allocator
  64.     void AllocMem(int iAllocSize);
  65.     // initializer (used for automatic initialization)
  66.     static struct pidl_initializer {
  67.         pidl_initializer();
  68.         ~pidl_initializer();
  69.     } m_initializer;
  70.     friend struct pidl_initializer;
  71. };
  72. #endif  // __PIDL_H