当前位置 博文首页 > dasgk的专栏:自定义实现IStream

    dasgk的专栏:自定义实现IStream

    作者:[db:作者] 时间:2021-08-04 15:06

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

    cs