⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fileproperties.h

📁 CodezBank is just a small application that stores source code snippets organized in a hierarhichal m
💻 H
字号:
#pragma once

namespace Utils{
class CFileProps
{
public:
   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   CFileProps(LPCTSTR lpFile, bool bNTFSStream=true):
     m_pPropSetStg(NULL)
   , m_pPropStg(NULL)
   , m_pPropDoc(NULL)
   {
      CString strFile(lpFile);

      HRESULT hr = S_OK;

      DWORD dwFmt = STGFMT_FILE;

      if(bNTFSStream == false)
         dwFmt = STGFMT_STORAGE;

      hr = ::StgOpenStorageEx(strFile.AllocSysString(), 
                              STGM_READWRITE| STGM_SHARE_EXCLUSIVE,
                              dwFmt,
                              // STGFMT_STORAGE => Structured Storage 
                                                // property sets
                              // STGFMT_FILE    => NTFS file system 
                                                 // property sets
                              0, NULL, NULL,
                              IID_IPropertySetStorage,
                              reinterpret_cast<void**>(&m_pPropSetStg) );

      if(FAILED(hr))
         throw new CFileException();

      hr = m_pPropSetStg->Open(FMTID_SummaryInformation,
                               STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 
                               &m_pPropStg);
      if(FAILED(hr))
      {
         if(hr == STG_E_FILENOTFOUND)
         {
            hr = m_pPropSetStg->Create(FMTID_SummaryInformation, 
                                       NULL, PROPSETFLAG_DEFAULT, 
                                       STGM_CREATE|STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
                                       &m_pPropStg);
         }
         else
         {
            m_pPropSetStg->Release();
            throw new CFileException();
         }
      }

      hr = m_pPropSetStg->Open(FMTID_DocSummaryInformation,
                               STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 
                               &m_pPropDoc);

      if(FAILED(hr))
      {
         if(hr == STG_E_FILENOTFOUND || hr == STG_E_INVALIDHEADER)
         {
            hr = m_pPropSetStg->Create(FMTID_DocSummaryInformation, 
                                       NULL, PROPSETFLAG_DEFAULT, 
                                       STGM_CREATE|STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
                                       &m_pPropDoc);
         }
         else
         {
            m_pPropSetStg->Release();
            throw new CFileException();
         }
      }
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   virtual ~CFileProps(void)
   {
      if(m_pPropStg)
         m_pPropStg->Release();

      if(m_pPropDoc)
         m_pPropDoc->Release();

      if(m_pPropSetStg)
         m_pPropSetStg->Release();
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   CString GetTitle(void)
   {
      return GetStringProperty(PIDSI_TITLE);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   bool SetTitle(LPCTSTR lpVal)
   {
      return SetStringProperty(PIDSI_TITLE, lpVal);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   CString GetSubject(void)
   {
      return GetStringProperty(PIDSI_SUBJECT);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   bool SetSubject(LPCTSTR lpVal)
   {
      return SetStringProperty(PIDSI_SUBJECT, lpVal);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   CString GetAuthor(void)
   {
      return GetStringProperty(PIDSI_AUTHOR);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   bool SetAuthor(LPCTSTR lpVal)
   {
      return SetStringProperty(PIDSI_AUTHOR, lpVal);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   CString GetKeywords(void)
   {
      return GetStringProperty(PIDSI_KEYWORDS);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   bool SetKeywords(LPCTSTR lpVal)
   {
      return SetStringProperty(PIDSI_KEYWORDS, lpVal);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   CString GetComments(void)
   {
      return GetStringProperty(PIDSI_COMMENTS);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   bool SetComments(LPCTSTR lpVal)
   {
      return SetStringProperty(PIDSI_COMMENTS, lpVal);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   CString GetCategory(void)
   {
      return GetStringPropertyDoc(PIDDSI_CATEGORY);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   bool SetCategory(LPCTSTR lpVal)
   {
      return SetStringPropertyDoc(PIDDSI_CATEGORY, lpVal);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   CString GetVersion(void)
   {
      return GetStringProperty(PIDSI_REVNUMBER);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   bool SetVersion(LPCTSTR lpVal)
   {
      return SetStringProperty(PIDSI_REVNUMBER, lpVal);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   CString GetTemplate(void)
   {
      return GetStringProperty(PIDSI_TEMPLATE);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   bool SetTemplate(LPCTSTR lpVal)
   {
      return SetStringProperty(PIDSI_TEMPLATE, lpVal);
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   CString GetLastAuthor(void)
   {
      return GetStringProperty(PIDSI_LASTAUTHOR);
   }

   bool SetLastAuthor(LPCTSTR lpVal)
   {
      return SetStringProperty(PIDSI_LASTAUTHOR, lpVal);
   }

protected:
   IPropertySetStorage* m_pPropSetStg;
   IPropertyStorage *   m_pPropStg;
   IPropertyStorage *   m_pPropDoc;

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   CString GetStringProperty(PROPID pid)
   {
      PROPSPEC propspec; 
      PROPVARIANT propvarRead; 

      propspec.ulKind = PRSPEC_PROPID;
      propspec.propid = pid;
      HRESULT hr = m_pPropStg->ReadMultiple( 1, &propspec, &propvarRead );

      CString sRet;
      
      switch(propvarRead.vt)
      {
      case VT_LPWSTR:
         sRet = CString(propvarRead.pwszVal);
         break;
      case VT_LPSTR:
         sRet = propvarRead.pszVal;
         break;
   }
   
   return sRet;
   }

   ///////////////////////////////////////////////
   ///
   /// 
   ///////////////////////////////////////////////
   bool SetStringProperty(PROPID pid, LPCTSTR lpVal)
   {
      CString strVal(lpVal);
      PROPSPEC propspec; 
      PROPVARIANT propvarWrite; 

      propspec.ulKind = PRSPEC_PROPID;
      propspec.propid = pid;

      propvarWrite.vt = VT_LPWSTR;
      propvarWrite.pwszVal =  strVal.AllocSysString();

      HRESULT hr = m_pPropStg->WriteMultiple( 1, &propspec, &propvarWrite, PID_FIRST_USABLE);
      if(FAILED(hr)) 
         return false;

      return true;
   }

   CString GetStringPropertyDoc(PROPID pid)
   {
      PROPSPEC propspec; 
      PROPVARIANT propvarRead; 

      propspec.ulKind = PRSPEC_PROPID;
      propspec.propid = pid;
      HRESULT hr = m_pPropDoc->ReadMultiple( 1, &propspec, &propvarRead );

      CString sRet;
      
      switch(propvarRead.vt)
      {
      case VT_LPWSTR:
         sRet = CString(propvarRead.pwszVal);
         break;
      case VT_LPSTR:
         sRet = propvarRead.pszVal;
         break;
      }
      
      return sRet;
   }

   bool SetStringPropertyDoc(PROPID pid, LPCTSTR lpVal)
   {
      CString strVal(lpVal);
      PROPSPEC propspec; 
      PROPVARIANT propvarWrite; 

      propspec.ulKind = PRSPEC_PROPID;
      propspec.propid = pid;

      propvarWrite.vt = VT_LPWSTR;
      propvarWrite.pwszVal =  strVal.AllocSysString();

      HRESULT hr = m_pPropDoc->WriteMultiple( 1, &propspec, &propvarWrite, PID_FIRST_USABLE);
      if(FAILED(hr)) 
         return false;

      return true;
   }
};
};

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -