现在的位置: 首页 > 综合 > 正文

自定义实现IStream

2013年12月03日 ⁄ 综合 ⁄ 共 5744字 ⁄ 字号 评论关闭
// IStream.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include
#include
using namespace std;
class hInstance:public IStream
{
private:
	ULONG m_AddRef;
	char* m_buf;//缓冲区指针
	ULONG m_cur_position;//当前缓冲区的当前位置
public:
	hInstance()
	{
		m_AddRef=0;
		m_buf=NULL;
		m_cur_position=0;
	}
	~hInstance()
	{
		;
	}
public:
	ULONG _stdcall AddRef()
	{
		m_AddRef++;
		return m_AddRef;
	}
	ULONG _stdcall Release()
	{
		m_AddRef--;
		if(0==m_AddRef)
		{
			delete []m_buf;
			m_buf=NULL;
			delete this;
		}
		return m_AddRef;
	}
	STDMETHOD( QueryInterface)(REFIID riid,void** pUnk)
	{
		if(riid==IID_IUnknown)
		{
			*pUnk=(IUnknown*)reinterpret_cast(this);
			reinterpret_cast(this)->AddRef();			
			return S_OK;
		}
		else if(riid==IID_IStream)
		{


			*pUnk=(IStream*)reinterpret_cast(this);
			reinterpret_cast(this)->AddRef();
			return S_OK;
		}else
			return E_NOINTERFACE; 
	}
	///////////////////////////////////////////////////////////////////////////////////
	//函数名称:Seek
	//函数描述:定位内存操作
	//函数参数:...
	//返回  值:HRESULT
	/////////////////////////////////////////////////////////////////////////////////


	STDMETHOD( Seek)( 
		/* [in] */ LARGE_INTEGER dlibMove,
		/* [in] */ DWORD dwOrigin,
		/* [annotation] */ 
		__out_opt  ULARGE_INTEGER *plibNewPosition)
	{
		if(dwOrigin==STREAM_SEEK_SET)
		{
			//说明起始位置在开头dlibMove必须大于0
			if(dlibMove.LowPart>strlen(m_buf))
			{
				plibNewPosition=NULL;
				return E_INVALIDARG;
			}
			m_cur_position=dlibMove.LowPart;
			return S_OK;


		}else if(dwOrigin==STREAM_SEEK_CUR)
		{
			//说明起始位置在当前所指
			plibNewPosition=NULL;
			if(dlibMove.LowPart+m_cur_position>strlen(m_buf))
			{
				m_cur_position=0;
				return E_INVALIDARG;
			}else 
			{
				m_cur_position+=dlibMove.LowPart;
				return S_OK;
			}
		}else if(dwOrigin==STREAM_SEEK_END)
		{
			//说明起始位置在末尾,dlibMove必须小于0
			plibNewPosition=NULL;
			if(dlibMove.LowPart+m_cur_position>strlen(m_buf))
			{
				m_cur_position=0;
				return E_INVALIDARG;;
			}else
			{
				m_cur_position+=dlibMove.LowPart;
				return S_OK;
			}
		}
		else
			return E_INVALIDARG;
	}
	////////////////////////////////////////////////////////////////////////////////
	//函数结束
	////////////////////////////////////////////////////////////////////////////////


	///////////////////////////////////////////////////////////////////////////////
	//函数名称:Write
	//函数描述:向缓冲区中写入
	//入口参数:无
	//返回  值:HRESULT
	///////////////////////////////////////////////////////////////////////////////
	STDMETHOD(Write)( 
		/* [annotation] */ 
		__in_bcount(cb)  const void *pv,
		/* [in] */ ULONG cb,
		/* [annotation] */ 
		__out_opt  ULONG *pcbWritten)
	{
		int str_len=0;
		char* tmp_buf=NULL;
		if(m_buf!=NULL)
		{
			str_len=strlen(m_buf);
			tmp_buf=new char[str_len+1];
			memset(tmp_buf,0,str_len+1);
			strncpy(tmp_buf,(char*)pv,str_len);
		}






		int sum_len=str_len+strlen((char*)pv);
		delete m_buf;
		m_buf=NULL;
		m_buf=new char[sum_len+1];
		memset(m_buf,0,sum_len);
		strncpy(m_buf,tmp_buf,str_len);
		strncpy(m_buf+str_len,(char*)pv,sum_len-str_len);
		delete tmp_buf;
		tmp_buf=NULL;
		return S_OK;
	}
	////////////////////////////////////////////////////////////////////////////////
	//函数结束
	////////////////////////////////////////////////////////////////////////////////




	///////////////////////////////////////////////////////////////////////////////
	//函数名称:Read
	//函数描述:向缓冲区中写入
	//入口参数:无
	//返回  值:HRESULT
	///////////////////////////////////////////////////////////////////////////////
	STDMETHOD( Read)( 
		/* [annotation] */ 
		__out_bcount_part(cb, *pcbRead)  void *pv,
		/* [in] */ ULONG cb,
		/* [annotation] */ 
		__out_opt  ULONG *pcbRead)
	{
		strncpy((char*)pv,m_buf,cb);
		return S_OK;
	}
	////////////////////////////////////////////////////////////////////////////////
	//函数结束
	////////////////////////////////////////////////////////////////////////////////




	///////////////////////////////////////////////////////////////////////////////
	//函数名称:SetSize
	//函数描述:重新调整缓冲区大小
	//入口参数:无
	//返回  值:HRESULT
	///////////////////////////////////////////////////////////////////////////////
	STDMETHOD(  SetSize)( 
		/* [in] */ ULARGE_INTEGER libNewSize)
	{
		if(strlen(m_buf)>libNewSize.LowPart)
		{
			//要将缓冲区截断
			m_buf[libNewSize.LowPart]='\0';
		}
		else
		{
			//扩大缓冲区
			char* tmp_buf=new char[strlen(m_buf)+1];
			memset(tmp_buf,0,strlen(m_buf)+1);
			strcpy(tmp_buf,m_buf);
			delete m_buf;
			m_buf=NULL;
			m_buf=new char[libNewSize.LowPart];
			strcpy(m_buf,tmp_buf);
			delete tmp_buf;
			tmp_buf=NULL;
		}
		return S_OK;


	}
	////////////////////////////////////////////////////////////////////////////////
	//函数结束
	////////////////////////////////////////////////////////////////////////////////




	///////////////////////////////////////////////////////////////////////////////
	//函数名称:CopyTo
	//函数描述:将缓冲区的内容copy到pstm
	//入口参数:无
	//返回  值:HRESULT
	///////////////////////////////////////////////////////////////////////////////
	STDMETHOD(CopyTo)( 
		/* [unique][in] */ IStream *pstm,
		/* [in] */ ULARGE_INTEGER cb,
		/* [annotation] */ 
		__out_opt  ULARGE_INTEGER *pcbRead,
		/* [annotation] */ 
		__out_opt  ULARGE_INTEGER *pcbWritten)
	{
		return pstm->Write(m_buf,strlen(m_buf),NULL);
	}
	////////////////////////////////////////////////////////////////////////////////
	//函数结束
	////////////////////////////////////////////////////////////////////////////////






	///////////////////////////////////////////////////////////////////////////////
	//函数名称:Clone
	//函数描述:将缓冲区的内容copy到pstm
	//入口参数:无
	//返回  值:HRESULT
	///////////////////////////////////////////////////////////////////////////////
	STDMETHOD(Clone)( 
		/* [out] */ __RPC__deref_out_opt IStream **ppstm) 
	{
		return S_OK;
	}
	////////////////////////////////////////////////////////////////////////////////
	//函数结束
	////////////////////////////////////////////////////////////////////////////////
	STDMETHOD( Commit)( 
		/* [in] */ DWORD grfCommitFlags)
	{
		return S_OK;
	}
	STDMETHOD( Revert)( void) 
	{
		return S_OK;
	}
	STDMETHOD( UnlockRegion)( 
		/* [in] */ ULARGE_INTEGER libOffset,
		/* [in] */ ULARGE_INTEGER cb,
		/* [in] */ DWORD dwLockType)
	{
		return S_OK;
	}
	STDMETHOD(  Stat)( 
		/* [out] */ __RPC__out STATSTG *pstatstg,
		/* [in] */ DWORD grfStatFlag) 
	{
		return S_OK;
	}
	STDMETHOD( LockRegion)( 
		/* [in] */ ULARGE_INTEGER libOffset,
		/* [in] */ ULARGE_INTEGER cb,
		/* [in] */ DWORD dwLockType)
	{
		return S_OK;
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	hInstance *tmp=new hInstance();
	IStream*pstm=NULL;
	HRESULT hr=tmp->QueryInterface(IID_IStream,(void**)&pstm);
	hr=pstm->Write("dasdasd",strlen("dasdasd"),NULL);


	pstm->Release();
	return 0;
}

以上就是我自定义实现的IStream接口,在windows控制台下即可实现,在此过程中多次出现不能实例化基类,其根本原因是有的虚函数你还没有实现!!,好了就到这了

【上篇】
【下篇】

抱歉!评论已关闭.