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

📄 bytearraystream.h

📁 壓縮程式, VC++ 原始碼及Demo 程式集
💻 H
字号:

#pragma once

class CBAStreamReader : public ISequentialStream
{
public:
	CBAStreamReader(const BYTE* pData, UINT nSize)
		: m_pData(pData), m_Size(nSize), m_Pos(0) {}
	CBAStreamReader(CBAStreamReader& bsr)
		: m_pData(bsr.m_pData), m_Size(bsr.m_Size), m_Pos(bsr.m_Pos) {}
	~CBAStreamReader()
	{}

	HRESULT STDMETHODCALLTYPE QueryInterface( REFIID iid, void ** ppvObject )
	{
		if ( IsEqualIID(iid, IID_ISequentialStream) )
		{
			*ppvObject = this;
			AddRef();
			return S_OK;
		}

		return E_NOINTERFACE;
	}

	ULONG STDMETHODCALLTYPE AddRef(void) { return 1; }
	ULONG STDMETHODCALLTYPE Release(void) { return 1; }

	HRESULT STDMETHODCALLTYPE Read(void * pv, ULONG cb, ULONG * pcbRead )
	{
		UINT nDiff = m_Size - m_Pos;
		UINT nMin = min(nDiff, cb);
		memcpy(pv, m_pData + m_Pos, nMin);
		m_Pos += nMin;
		if ( pcbRead )
		{
			*pcbRead = nMin;
			return S_OK;
		}
		else
		{
			return S_FALSE;
		}
	}

	HRESULT STDMETHODCALLTYPE Write(const void * pv, ULONG cb, ULONG * pcbWritten )
	{
		UNREFERENCED_PARAMETER(pv);
		UNREFERENCED_PARAMETER(cb);
		UNREFERENCED_PARAMETER(pcbWritten);
		return E_ACCESSDENIED;
	}

protected:
	const BYTE*	m_pData;
	UINT		m_Size;
	UINT		m_Pos;
};

class CBAStreamWriter : public ISequentialStream
{
public:
	CBAStreamWriter(CByteArray& ba)
		: m_ba(ba), m_Pos(0) {}
	CBAStreamWriter(CBAStreamWriter& bas)
		: m_ba(bas.m_ba), m_Pos(bas.m_Pos) {}
	~CBAStreamWriter()
	{}

	HRESULT STDMETHODCALLTYPE QueryInterface( REFIID iid, void ** ppvObject )
	{
		if ( IsEqualIID(iid, IID_ISequentialStream) )
		{
			*ppvObject = this;
			AddRef();
			return S_OK;
		}

		return E_NOINTERFACE;
	}

	ULONG STDMETHODCALLTYPE AddRef(void) { return 1; }
	ULONG STDMETHODCALLTYPE Release(void) { return 1; }

	HRESULT STDMETHODCALLTYPE Read(void * pv, ULONG cb, ULONG * pcbRead )
	{
		UNREFERENCED_PARAMETER(pv);
		UNREFERENCED_PARAMETER(cb);
		UNREFERENCED_PARAMETER(pcbRead);
		return E_ACCESSDENIED;
	; }

	HRESULT STDMETHODCALLTYPE Write(const void * pv, ULONG cb, ULONG * pcbWritten )
	{
		UINT nDiff = m_ba.GetSize() - m_Pos;
		if ( nDiff < cb )
		{
			m_ba.SetSize( m_ba.GetSize() + cb - nDiff );
		}

		memcpy(m_ba.GetData() + m_Pos, pv, cb);
		m_Pos += cb;

		*pcbWritten = cb;

		return S_OK;
	}

protected:
	CByteArray&	m_ba;
	UINT		m_Pos;
};

⌨️ 快捷键说明

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