shell95.h
上传用户:dfhlxjd
上传日期:2007-01-07
资源大小:12k
文件大小:3k
源码类别:

Shell编程

开发平台:

Visual C++

  1. //----------------------------------------
  2. // (c) Reliable Software 1997
  3. //----------------------------------------
  4. #ifndef _shell95_H_INCLUDED
  5. #define _shell95_H_INCLUDED
  6. #include <windows.h>
  7. #include <shlobj.h>
  8. template <class T>class SIfacePtr
  9. {
  10. public:
  11.     ~SIfacePtr ()
  12.     {
  13.         Free ();
  14.     }
  15.     T * operator->() { return _p; }
  16.     T const * operator->() const { return _p; }
  17.     operator T const * () const { return _p; }
  18.     T const & GetAccess () const { return *_p; }
  19. protected:
  20.     SIfacePtr () : _p (0) {}
  21.     void Free ()
  22.     {
  23.         if (_p != 0)
  24.             _p->Release ();
  25.         _p = 0;
  26.     }
  27.     T * _p;
  28. private:
  29.     SIfacePtr (SIfacePtr const & p) {}
  30.     void operator = (SIfacePtr const & p) {}
  31. };
  32. template <class T>
  33. class SShellPtr
  34. {
  35. public:
  36.     ~SShellPtr ()
  37.     {
  38.         Free ();
  39.         _malloc->Release ();
  40.     }
  41.     //T * weak operator->() { return _p; }
  42.     T const * operator->() const { return _p; }
  43.     operator T const * () const { return _p; }
  44.     T const & GetAccess () const { return *_p; }
  45. protected:
  46.     SShellPtr () : _p (0) 
  47.     {
  48.         // Obtain malloc here, rather than
  49.         // in the destructor. 
  50.         // Destructor must be fail-proof.
  51.         if (SHGetMalloc (&_malloc) == E_FAIL)
  52.             throw "Couldn't obtain Shell Malloc"; 
  53.     }
  54.     void Free ()
  55.     {
  56.         if (_p != 0)
  57.             _malloc->Free (_p);
  58.         _p = 0;
  59.     }
  60.     T * _p;
  61.     IMalloc *  _malloc;
  62. private:
  63.     SShellPtr (SShellPtr const & p) {}
  64.     void operator = (SShellPtr const & p) {}
  65. };
  66. class Desktop: public SIfacePtr<IShellFolder>
  67. {
  68. public:
  69.     Desktop ()
  70.     {
  71.         if (SHGetDesktopFolder (&_p) != NOERROR)
  72.             throw "SHGetDesktopFolder failed";
  73.     }
  74. };
  75. class ShPath: public SShellPtr<ITEMIDLIST>
  76. {
  77. public:
  78.     ShPath (SIfacePtr<IShellFolder> & folder, wchar_t * path = L"")
  79.     {
  80.         ULONG lenParsed = 0;
  81.         _hresult = folder->ParseDisplayName (0, 0, path, &lenParsed, &_p, 0);
  82.     }
  83.     bool IsOK () const { return SUCCEEDED (_hresult); }
  84. private:
  85.     HRESULT _hresult;
  86. };
  87. class FolderBrowser: public SShellPtr<ITEMIDLIST>
  88. {
  89. public:
  90.     FolderBrowser (
  91.         HWND hwndOwner,
  92.         SShellPtr<ITEMIDLIST> & root,
  93.         UINT browseForWhat,
  94.         char const *title);
  95.     char const * GetDisplayName () { return _displayName; }
  96.     char const * GetPath ()        { return _fullPath; }
  97.     bool IsOK() const              { return _p != 0; };
  98. private:
  99.     char       _displayName [MAX_PATH];
  100.     char       _fullPath [MAX_PATH];
  101.     BROWSEINFO _browseInfo;
  102. };
  103. FolderBrowser::FolderBrowser (
  104.     HWND hwndOwner,
  105.     SShellPtr<ITEMIDLIST> & root,
  106.     UINT browseForWhat,
  107.     char const *title)
  108. {
  109.     _displayName [0] = '';
  110.     _fullPath [0] = '';
  111.     _browseInfo.hwndOwner = hwndOwner;
  112.     _browseInfo.pidlRoot = root; 
  113.     _browseInfo.pszDisplayName = _displayName;
  114.     _browseInfo.lpszTitle = title;
  115.     _browseInfo.ulFlags = browseForWhat; 
  116.     _browseInfo.lpfn = 0;
  117.     _browseInfo.lParam = 0;
  118.     _browseInfo.iImage = 0;
  119.     // Let the user do the browsing
  120.     _p = SHBrowseForFolder (&_browseInfo);
  121.      if (_p != 0)
  122.         SHGetPathFromIDList (_p, _fullPath);
  123. }
  124. #endif // _shell95_H_INCLUDED