有没有办法把一个OLE对象保存为一个图片文件

PunWinger 2010-10-24 04:28:31
假设有一个LPOLEOBJECT的指针指向这个OLE对象,这个OLE对象是一张BMP图片,有没有办法把它保存为一个图片文件,而不是一个复合文件?
其实我是想把一个RichEdit里插入的图片保存为一个可以很容易浏览的图片文件,我曾经试过用GetObject获得了这个OLE对象的IStorage,曾经对这个IStorage进行过各种各样的读取操作,发现都是失败的,又尝试过用StreamOut来把图片输出,发现无法读取这个图片文件,最后也曾尝试过把这个OLE对象保存为一个复合文件,曾经用UltraEdit查看过这个复合文档,发现文件头添加了一部分字节,中间是图片一样的内容,末尾也添加了一些FF的字节,但是由于无法确定添加字节的大小,所以还是放弃了这个做法.
于是求问各位,有没有办法把一个插入到RichEdit的OLE对象保存为一个图片文件,就是.jpg,.bmp还可以浏览到的文件
...全文
516 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
dvlinker 2012-02-20
  • 打赏
  • 举报
回复

// 下面找到选中图片对象对应的位图句柄,通过句柄将图片数据保存到文件中
// 注意:下面的代码只对位图有效,对于TrueLink自带的表情对象,则不起作
// 用(GetData接口会获取失败,故无法保存到文件中)
BOOL bSavePicSuccess = FALSE;
int nCount = pRichOle->GetObjectCount(); // 当前m_ChatEdit中所有的object对象
for ( int i=0; i<nCount; i++ )
{
REOBJECT reobject;
memset( &reobject, 0 , sizeof(REOBJECT) );
reobject.cbStruct = sizeof(REOBJECT);

SCODE sc = pRichOle->GetObject( i, &reobject, REO_GETOBJ_ALL_INTERFACES ); // 获取到reobject对象
if ( sc != S_OK )
{
continue;
}

if ( (reobject.dwFlags & REO_SELECTED) != REO_SELECTED ) // 检验当前reobject是否处于选中状态
{
continue; // 不是当前选中的对象,继续查找
}

IDataObject* pDataObject = NULL;
sc = reobject.poleobj->QueryInterface( IID_IDataObject, (void**)&pDataObject ); // 获取IDataObject信息
if ( sc != S_OK )
{
break; // 已经找到选中的图片对象,获取信息失败,直接退出
}

// 要对fm参数进行设置,指明要从IStorage中获取什么样的信息,否则GetData接口会获取stg信息失败
STGMEDIUM stg;
FORMATETC fm;
fm.cfFormat = CF_BITMAP; // 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; // 对应CF_BITMAP

HRESULT hr = pDataObject->GetData( &fm, &stg );
if ( hr != S_OK || stg.hBitmap == NULL )
{
break; // 已经找到选中的图片对象,获取信息失败,直接退出
}

BOOL bRet = SaveBmpDataToFile( stg.hBitmap, csFilePath );
if ( bRet )
{
bSavePicSuccess = TRUE;
}
}

if ( !bSavePicSuccess )
{
AfxMessageBox( _T("图片保存失败!") );
}
liaozcYAOBOT 2011-04-10
  • 打赏
  • 举报
回复
QQ是不是自己做编码的?,在接收到的时候把其中的图像再提起出来的吧。我自己猜的,因为有一个控件esrichedit 好像这样做的。
PunWinger 2010-10-25
  • 打赏
  • 举报
回复
再顶一顶吧..
PunWinger 2010-10-24
  • 打赏
  • 举报
回复
怎么没有人回答呢?
其实我想做一个IM的发送图片的功能,我查了一下QQ的文件,发现每当我发送一幅图片,或者接受一幅图片的时候,QQ都会在一个文件夹里存放这个图片文件,然后估计是用RichEdit显示图片,所以我想实现类似功能,主要难题就是如何把RichEdit里的OLE对象保存为一个图片文件,而不是符合文件

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧