我使用OLE对象向RichEdit中插入位图图片后,想将RichEdit中包括位图的所有的信息提取出来,传给IDataObject的接口对象,通过RichEdit的成员函数GetIRichEditOle得到接口IRichEditOle接口的指针,然后用IRichEditOle的接口指针的成员GetObject得到REOBJECT结构.
代码如下:FORMATETC fm;
STGMEDIUM *pmedium;
pmedium = new STGMEDIUM;
SCODE sc;
LPDATAOBJECT lpDataObject;
COleDataObject *pOleDataObject;
pOleDataObject = new COleDataObject;
REOBJECT reobject[MAX_BITMAP];fm.cfFormat = CF_BITMAP|CF_TEXT; // Clipboard format = CF_BITMAP
fm.ptd = NULL; // Target Device = Screen
fm.dwAspect = DVASPECT_CONTENT; // Level of detail = Full content
fm.lindex = -1; // Index = Not applicaple
fm.tymed = TYMED_GDI;

m_str_input=this->GetRTF();for(int i=0; i<MAX_BITMAP;i++)
{
   memset(&reobject[i],0,sizeof(REOBJECT));
   reobject[i].cbStruct = sizeof(REOBJECT);
}for(int i = 0; i < tmpCount;i++)
{
   sc = this->GetIRichEditOle()->GetObject(i,&reobject[i],  REO_GETOBJ_ALL_INTERFACES);
   if(sc!=S_OK)
   {
AfxThrowOleException(sc);
   }
}//this->OnSelectall();
//this->OnCut();for(int i = 0; i < m_BitmapArray.GetSize(); i++)
{
   for(int j = 0; j < tmpCount; j++)
   {
lpDataObject = (LPDATAOBJECT)pOleDataObject->AttachClipboard();
** ASSERT(pOleDataObject->IsDataAvailable(CF_BITMAP,&fm));
//sc = this->GetIRichEditOle()->GetClipboardData(&cr,RECO_CUT,&lpDataObject);
//if(sc != S_OK)
//{
// AfxThrowOleException(sc);
// return NULL;
//}
//sc = this->GetIRichEditOle()->GetClipboardData(&cr,RECO_PASTE,&lpDataObject);
//if(sc != S_OK)
//{
// AfxThrowOleException(sc);
// return NULL;
//}
** sc = reobject[j].poleobj->GetClipboardData(CF_BITMAP,&lpDataObject);
if(sc != S_OK)
{
   AfxThrowOleException(sc);
   return NULL;
}
sc = lpDataObject->GetData(&fm,pmedium);
if(sc != S_OK)
{
  AfxThrowOleException(sc);
  return NULL;
} CBitmap *pBitmap;
pBitmap = new CBitmap;
ASSERT(pBitmap->Attach(pmedium->hBitmap));
if(pBitmap == ((PBITMAPSTR)m_BitmapArray.GetAt(i))->pBitmap)
{
MessageBox(_T("找到相同的位图"));
}
}   在我打**的地方是两处运行不能通过的地方,我在我的RichEdit编辑框中插入了几张Bitmap图片和文字,然后我通过GetIRichEditOle取出OLE对象的结构REOBJECT,再通过REOBJECT中的成员pOleObj(LPOLEOBJECT)得到其中的剪贴板的数据(位图),再通过lpDataObject取出位图数据的结构STGMEDIUM,从而得到位图的句柄(STGMEDIUM中的hBitmap).
   但是在运行的时候,在第一个和第二个**的地方出错了,说:剪贴板中没有数据.这是为什么.   另外:有什么别的办法可以提取出RichEdit中的位图信息吗?????   这是一个类似于MSN/QQ的表情程序,我在VC知识库中只找到了上部分,没有下部分.现在我的程序只能实现向RichEdit的输入窗口插入表情,但是怎么将RichEdit框中的内容提取出来,并转化成字符串发送出去却没有找到. 我该怎么实现啊???谢谢

解决方案 »

  1.   

    既然得到了 reobject 数组,就直接从 REOBJECT 结构的 poleobj (LPOLEOBJECT) 成员获取 IDataObject 接口并通过其函数STDMETHOD ( GetData )( FORMATETC *pformatetcIn, STGMEDIUM *pmedium );获得数据。
      

  2.   

    poleobj (LPOLEOBJECT)的成员函数中只有一个GetClipboardData可以得到IDataObject
    poleobj->GetClipboardData(CF_BITMAP,&lpDataObject) //lpDataObject是IDataObject的指针
    可是在上面一句中函数抛出的异常是:"需要运行此对象,以便进行这项操作";至于把东西复制到剪贴板中 在
    sc = this->GetIRichEditOle()->GetClipboardData(&cr,RECO_CUT,&lpDataObject);
    if(sc != S_OK)
    {
       AfxThrowOleException(sc);
       return NULL;

    我试过拉 剪贴进剪贴板成功了 但是lpDataObject却是0,用RECO_PASTElpDataObject不为0,可是用GetData()根本就得不到位图数据.