怎样将bmp图片放入CRichEditCtrl

最近在做MFC的IM类程序开发,有一个CRichEditCtrl控件用来发消息,现在想把CBitmap图片放入到这个控件中,网上试了好多代码都不行,希望指导一下

//将图片放在richedit中
void BugReportDialog::InsertPicToRichEdit(HBITMAP hbitmap)
{
HBITMAP bmp = hbitmap;

//创建HBITMAP

//bmp = (HBITMAP)::LoadImage(NULL, *pBmpFile, IMAGE_BITMAP, 0, 0,

// LR_LOADFROMFILE|LR_DEFAULTCOLOR|LR_DEFAULTSIZE);

STGMEDIUM stgm;     
stgm.tymed = TYMED_GDI;     
stgm.hBitmap = bmp;     
stgm.pUnkForRelease = NULL;     

FORMATETC fm;     
fm.cfFormat = CF_BITMAP;     
fm.ptd = NULL;     
fm.dwAspect = DVASPECT_CONTENT;     
fm.lindex = -1;     
fm.tymed = TYMED_GDI;      

//创建输入数据源      
IStorage *pStorage;     

//分配内存      
LPLOCKBYTES lpLockBytes = NULL;     
SCODE sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes);     
if (sc != S_OK)     
    AfxThrowOleException(sc);     
ASSERT(lpLockBytes != NULL);     

sc = ::StgCreateDocfileOnILockBytes(lpLockBytes,     
    STGM_SHARE_EXCLUSIVE|STGM_CREATE|STGM_READWRITE, 0, &pStorage);     
if (sc != S_OK)     
{     
    VERIFY(lpLockBytes->Release() == 0);     
    lpLockBytes = NULL;     
    AfxThrowOleException(sc);     
}     
ASSERT(pStorage != NULL);     

COleDataSource *pDataSource = new COleDataSource;     
pDataSource->CacheData(CF_BITMAP, &stgm);     
LPDATAOBJECT lpDataObject =     
    (LPDATAOBJECT)pDataSource->GetInterface(&IID_IDataObject);     

//获取RichEdit的OLEClientSite      
LPOLECLIENTSITE lpClientSite; 
CRichEditCtrl* m_rch = (CRichEditCtrl*)FromHandle(m_contentHwnd); 
m_rch->GetIRichEditOle()->GetClientSite(&lpClientSite);    

//创建OLE对象      
IOleObject *pOleObject;     
sc = OleCreateStaticFromData(lpDataObject,IID_IOleObject,OLERENDER_FORMAT,     
    &fm,lpClientSite,pStorage,(void **)&pOleObject);     
if(sc!=S_OK)     
    AfxThrowOleException(sc);     

//插入OLE对象      
REOBJECT reobject;     
ZeroMemory(&reobject, sizeof(REOBJECT));     
reobject.cbStruct = sizeof(REOBJECT);     

CLSID clsid;     
sc = pOleObject->GetUserClassID(&clsid);     
if (sc != S_OK)     
    AfxThrowOleException(sc);     

reobject.clsid = clsid;     
reobject.cp = REO_CP_SELECTION;     
reobject.dvaspect = DVASPECT_CONTENT;     
reobject.poleobj = pOleObject;     
reobject.polesite = lpClientSite;     
reobject.pstg = pStorage;     

HRESULT hr = m_rch->GetIRichEditOle()->InsertObject( &reobject );     

delete pDataSource; 

}

http://www.docin.com/p-676139597.html

如果不行,请说清楚什么错误,怎么不行

http://www.cppblog.com/kyelin/archive/2007/05/25/24816.html

http://wenku.baidu.com/link?url=_mVDkSZU7jQvzb4F8wnso4gZu7jcQMzTNOOHdKDHgiaAa1zkOXb5X3cxF_LpU1LEp0boYCwvsF4MeFgD11HsJyqMZrOjqa3UAwJhfUhZ8aK