自定义实现IStream


// 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控制台下即可实现,在此过程中多次出现不能实例化基类,其根本原因是有的虚函数你还没有实现!!,好了就到这了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世纪殇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值