#pragma once class CImpIStream : public IStream { private: LONG m_cRef; protected: ULONG m_cbSeek; STATSTG m_statstg; public: CImpIStream(void); CImpIStream(PVOID pvData,ULONG cbSize); virtual ~CImpIStream(void); //IUnknown STDMETHODIMP QueryInterface( REFIID riid, void __RPC_FAR *__RPC_FAR *ppvObject); STDMETHODIMP_(ULONG) AddRef(void); STDMETHODIMP_(ULONG) Release(void); // IStream STDMETHODIMP Read( void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbRead); STDMETHODIMP Write( const void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbWritten); STDMETHODIMP Seek( LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER __RPC_FAR *plibNewPosition); STDMETHODIMP SetSize( ULARGE_INTEGER libNewSize); STDMETHODIMP CopyTo( IStream __RPC_FAR *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER __RPC_FAR *pcbRead, ULARGE_INTEGER __RPC_FAR *pcbWritten); STDMETHODIMP Commit( DWORD grfCommitFlags); STDMETHODIMP Revert( void); STDMETHODIMP LockRegion( ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType); STDMETHODIMP UnlockRegion( ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType); STDMETHODIMP Stat( STATSTG __RPC_FAR *pstatstg, DWORD grfStatFlag); STDMETHODIMP Clone( IStream __RPC_FAR *__RPC_FAR *ppstm); }; class CStreamMem : public CImpIStream { private: PVOID m_pvData; BOOL m_fExternalData; public: CStreamMem(void); CStreamMem(PVOID pvData,ULONG cbSize); ~CStreamMem(void); // IStream STDMETHODIMP Read( void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbRead); STDMETHODIMP Write( const void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbWritten); STDMETHODIMP Seek( LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER __RPC_FAR *plibNewPosition); STDMETHODIMP SetSize( ULARGE_INTEGER libNewSize); STDMETHODIMP CopyTo( IStream __RPC_FAR *pstm, ULARGE_INTEGER cb, ULARGE_INTEGER __RPC_FAR *pcbRead, ULARGE_INTEGER __RPC_FAR *pcbWritten); STDMETHODIMP GetPointerFromStream(PVOID *ppv,DWORD *pdwSize); }; class CStreamFile : public CImpIStream { private: HANDLE m_hFile; BOOL m_fCloseHandle; BOOL m_fReadOnly; public: CStreamFile(HANDLE hFile,BOOL fCloseHandle = FALSE, BOOL fReadOnly = FALSE); ~CStreamFile(void); // IStream STDMETHODIMP Read( void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbRead); STDMETHODIMP Write( const void __RPC_FAR *pv, ULONG cb, ULONG __RPC_FAR *pcbWritten); STDMETHODIMP Seek( LARGE_INTEGER dlibMove, DWORD dwOrigin, ULARGE_INTEGER __RPC_FAR *plibNewPosition); STDMETHODIMP SetSize( ULARGE_INTEGER libNewSize); STDMETHODIMP Commit( DWORD grfCommitFlags); };