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