www.pudn.com > TVToolbar_demo > Chits.h


// 
// Used for reading files out of a .CHM or .ITS file 
 
 
#ifndef __CHITS_H__ 
#define __CHITS_H__ 
 
#if _MSC_VER > 1000 
#pragma once 
#endif // _MSC_VER > 1000 
 
DEFINE_GUID(CLSID_ITStorage, 0x5d02926a, 0x212e, 0x11d0, 0x9d, 0xf9, 0x0, 0xa0, 0xc9, 0x22, 0xe6, 0xec); 
DEFINE_GUID(IID_ITStorage, 0x88cc31de, 0x27ab, 0x11d0, 0x9d, 0xf9, 0x0, 0xa0, 0xc9, 0x22, 0xe6, 0xec); 
 
typedef struct _ITS_Control_Data 
{ 
    UINT cdwControlData;      
    UINT adwControlData[1];   
 
} ITS_Control_Data, *PITS_Control_Data;   
 
typedef enum ECompactionLev {  
    COMPACT_DATA = 0,  
    COMPACT_DATA_AND_PATH 
}; 
 
DECLARE_INTERFACE_(IITStorage, IUnknown) 
{ 
    STDMETHOD(StgCreateDocfile) (const WCHAR* pwcsName, DWORD grfMode, DWORD reserved, IStorage** ppstgOpen) PURE; 
 
    STDMETHOD(StgCreateDocfileOnILockBytes) (ILockBytes * plkbyt, DWORD grfMode,  
                            DWORD reserved, IStorage ** ppstgOpen) PURE; 
 
    STDMETHOD(StgIsStorageFile) (const WCHAR * pwcsName) PURE; 
 
    STDMETHOD(StgIsStorageILockBytes) (ILockBytes * plkbyt) PURE; 
 
    STDMETHOD(StgOpenStorage)(const WCHAR * pwcsName, IStorage * pstgPriority,  
                              DWORD grfMode, SNB snbExclude, DWORD reserved,  
                              IStorage ** ppstgOpen 
                             ) PURE; 
 
    STDMETHOD(StgOpenStorageOnILockBytes) 
                  (ILockBytes * plkbyt, IStorage * pStgPriority, DWORD grfMode,  
                   SNB snbExclude, DWORD reserved, IStorage ** ppstgOpen 
                  ) PURE; 
 
    STDMETHOD(StgSetTimes)(WCHAR const * lpszName,  FILETIME const * pctime,  
                           FILETIME const * patime, FILETIME const * pmtime 
                          ) PURE; 
 
    STDMETHOD(SetControlData)(PITS_Control_Data pControlData) PURE; 
 
    STDMETHOD(DefaultControlData)(PITS_Control_Data *ppControlData) PURE; 
		 
    STDMETHOD(Compact)(const WCHAR* pwcsName, ECompactionLev iLev) PURE; 
}; 
 
class CHitsFile 
{ 
public: 
    CHitsFile(); 
    ~CHitsFile(); 
 
    IStorage* GetStorage(void) { return m_pStorage; }   // this is the root storage 
 
    HRESULT   OpenITS(PCSTR pszFile); 
 
    HRESULT OpenStorage(PCSTR pszName, IStorage** ppStorage, DWORD dwAccess = STGM_READWRITE) { 
                return m_pStorage->OpenStorage(FileNameToWCHAR(pszName), NULL, dwAccess, 0, 0, ppStorage); } 
    HRESULT OpenStream(PCSTR pszFile, IStream** ppStream, IStorage* pStorage, DWORD dwAccess = STGM_READWRITE) { 
                return pStorage->OpenStream(FileNameToWCHAR(pszFile), NULL, dwAccess, 0, ppStream); } 
 
protected: 
    WCHAR* FileNameToWCHAR(PCSTR psz); 
 
    IITStorage*   m_pITStorage; 
    IStorage*     m_pStorage; 
    WCHAR*        m_pwTmpFile; 
}; 
 
// Use this class to extract strings from the #STRINGS subfile 
 
class CStringSubFile 
{ 
public: 
    CStringSubFile(CHitsFile* pif); 
    ~CStringSubFile(); 
 
    bool GetString(DWORD offset, char* pszDst, int cbDst); 
 
protected: 
    IStream*      m_pStream;     // pointer to #STRINGS stream 
    CHitsFile*    m_pif; 
}; 
 
#endif  // __CHITS_H__