HRESULT hr;
HWND   hRichEdit   =   this-> m_hWnd;
LPRICHEDITOLE pRichEditOle;
::SendMessage(hRichEdit, EM_GETOLEINTERFACE, 0, (LPARAM)&pRichEditOle); if (pRichEditOle == NULL)
{
return FALSE;
} LPLOCKBYTES pLockBytes = NULL;
hr = CreateILockBytesOnHGlobal(NULL, TRUE, &pLockBytes);
try
{
if (FAILED(hr))
{
_com_issue_error(hr);
return FALSE;
} LPSTORAGE pStorage;
hr = StgCreateDocfileOnILockBytes(pLockBytes, 
STGM_SHARE_EXCLUSIVE | STGM_CREATE | STGM_READWRITE, 
0, &pStorage); if (FAILED(hr))
{
_com_issue_error(hr);
return FALSE;
} FORMATETC formatEtc;
formatEtc.cfFormat = 0;
formatEtc.ptd = NULL;
formatEtc.dwAspect = DVASPECT_CONTENT;
formatEtc.lindex = -1;
formatEtc.tymed = TYMED_GDI; LPOLECLIENTSITE pClientSite;
hr = pRichEditOle->GetClientSite(&pClientSite); if (FAILED(hr))
{
_com_issue_error(hr);
return FALSE;
} LPUNKNOWN pUnk;
CLSID clsid = CLSID_NULL; LPDATAOBJECT lpdata;
hr = OleGetClipboard(&lpdata); if (FAILED(hr))
{
_com_issue_error(hr);
return FALSE;
} LPPICTDESC S;

hr = OleQueryCreateFromData(lpdata);      //判断剪切板中的内容
if (FAILED(hr))
{
_com_issue_error(hr);
return FALSE;
} else if (hr == OLE_S_STATIC )           //static
{
hr = OleCreateStaticFromData(lpdata,  IID_IUnknown, OLERENDER_DRAW, 
&formatEtc, pClientSite, pStorage, (void**)&pUnk);
} else if (hr == S_OK)              //ole对象
{
hr = OleCreateFromData(lpdata,  IID_IUnknown, OLERENDER_NONE, 
&formatEtc, pClientSite, pStorage, (void**)&pUnk);
} else if (hr == S_FALSE)
{
return FALSE;
}
pClientSite->Release(); if (FAILED(hr))
{
_com_issue_error(hr);
return FALSE;
} LPOLEOBJECT pObject;
hr = pUnk->QueryInterface(IID_IOleObject, (void**)&pObject);
pUnk->Release(); if (FAILED(hr))
{
_com_issue_error(hr);
return FALSE;
} OleSetContainedObject(pObject, TRUE);
REOBJECT reobject = { sizeof(REOBJECT)};
hr = pObject->GetUserClassID(&clsid); if (FAILED(hr))
{
pObject->Release();
_com_issue_error(hr);
return FALSE;
} reobject.clsid = clsid;
reobject.cp = REO_CP_SELECTION;
reobject.dvaspect = DVASPECT_CONTENT;
reobject.dwFlags = REO_RESIZABLE | REO_BELOWBASELINE ;
reobject.dwUser = 0;
reobject.poleobj = pObject;
reobject.polesite = pClientSite;
reobject.pstg = pStorage;
SIZEL sizel = { 0 };
reobject.sizel = sizel; ::SendMessage(hRichEdit, EM_SETSEL, 0, -1);
DWORD dwStart, dwEnd;
::SendMessage(hRichEdit, EM_GETSEL, (WPARAM)&dwStart, (LPARAM)&dwEnd);
::SendMessage(hRichEdit, EM_SETSEL, dwEnd+1, dwEnd+1);
::SendMessage(hRichEdit, EM_REPLACESEL, TRUE, (WPARAM)L"\n");  hr = pRichEditOle->InsertObject(&reobject);
pObject->Release();
pRichEditOle->Release(); if (FAILED(hr))
{
_com_issue_error(hr);
return FALSE;
}
}
catch(   _com_error   e   )
{
AfxMessageBox(e.ErrorMessage());
}
return TRUE;上面的代码可以以文件粘贴到richedit。但如果把一个图片打开然后复制粘贴hr = OleQueryCreateFromData(lpdata);      hr返回S_false,我看到MSDN上上面说图片会返回OLE_S_STATIC,可为什么返回S_false。真心求会的人赐教。
还有那个http://www.codeproject.com/Articles/9541/A-Rich-Edit-Control-That-Displays-Bitmaps-and-Othe上说实现了粘贴图片?我没看懂哪里实现。。